Неоднозначность
Без elsif при синтаксическом разборе всегда возникает неоднозначность, поскольку на момент входа в оператор еще не известно, единственный он во вложенном блоке или нет. Все последующие блоки также под вопросом, поскольку теперь не понятно, какой end какой блок завершает:if условие1 thenС привычными отступами выглядит понятней:
операторы;
else if условие2 then
операторы;
end;
операторы;
end; /* это лишний end или завершение предыдущего if,
не единственного в блоке? */
if условие1 thenПроблема характерна для любого языка с блочными операторами ветвления и свободной записью: SQL, Модула-2, частично Ада.
операторы;
else
if условие2 then
операторы;
end;
операторы;
end;
В Канторе я вижу два выхода:
- Вернуть elsif и получить тонны ненависти от программистов, не любящих это ключевое слово.
- Не бояться «лишних» end при разборе. Тут нужен дополнительный анализ — что делать с возможными неоднозначностями. В любом случае это усложнит компилятор и затруднит проверку синтаксиса.
Принудительное совмещение в выражениях
В выражениях с if/case внутри веток могут стоять только одиночные значения или кортежи, поэтому принудительное совмещение не приводит к неоднозначности и elsif не нужен:a = if условие1 thenПример с кортежем отличается только числом значений:
значение1 // в выражениях точка с запятой не ставится
else if условие1 then
значение2
// из-за отсутствия точки с запятой никакие другие операторы
// тут недопустимы
end;
a, b, c = if условие1 then
значение1, значение2, значение3 // точка с запятой опять не ставится
else if условие2 then
значение4, значение5, значение6
end;
В питоне используется elif, короче и чище, чем elsif.
ОтветитьУдалитьРабочая гипотеза на данный момент — не возвращать ни elsif, ни elif, а разрешить писать условие после else. Таким образом после одного if могут идти несколько else с условиями и последний else — без условия.
Удалить