Про синтаксис
От: Воронков Василий Россия  
Дата: 06.06.12 14:17
Оценка:
Есть такая идеологическая проблема.

Есть язык, с хаскеле-подобным синтаксисом (т.е. layout-based), выражения можно писать прямо в топ-левеле. Выражениями является все, кроме директив открытия модулей и глобальных let-биндингов. Однако два выражения подряд по типу:

2+2

someFunc x y


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

Вернее, на самом деле не так.

Код, как выше, вообще работает совсем не так, можно подумать. Т.е. для выражений на топ-левеле layout свободный, поэтому можно писать так:

if cond then
expr1
else
expr2


И это абсолютно корректно. Или так:

[] 
|> regFuns BasicTests
|> regFuns FunTests
|> regFuns RangeTests
|> regFuns ListTests


Однако как в первом случае писать нельзя, ибо такое выражение будет в реальности интерпретировано как:

(+) 2 2 someFunc x y


И здесь-то и кроется проблема.

С одной стороны — все логично. Нельзя писать код, который все равно приводил бы к ворнингам. С другой — нарушаются правила layout-а, и код, который кажется внешне правильным, приводит к весьма странной ошибке типа. Однако если включить layout для выражений на топ-левеле, то два предыдущих примера сразу же станут некорректными. Например, if придется писать так:

if cond then
  expr1
  else
  expr2


Какое из двух зол лучше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.