Здравствуйте, VladD2, Вы писали:
Д>>>и почему нельзя использовать ее с привычным С-style синтаксисом?
ANS>>можно. У java слишком большой синтаксический оверхед, а в C#2 всё нормально для этого.
VD>Ну, так и в чем дело? Чем тогда C# 2.0 хуже?
Я забыл упомянуть про такую фичу ST-блоков как нелокальный возврат (non-local return). Её несколько раз упоминали в этом форуме, но внимание особо не заостряли. Этой фичи нет ни в C#2, ни в java. То есть "с привычным С-синтаксисом" — можно, но по сути в C#2 — нельзя.
Рассмотрим уже привычный нам пример:
aValue := aDictionary at: aKey ifAbsent: [return nil].
... тут идёт, при котором aValue всегда имеет корректное значение ...
Вместо пугающей "крышечки" я написал слово "return". Так вот, "возврат" выполняется не в контексте блока, а в контексте где блок определён. То есть выполнение команды "return" из анонимной функции в C#, или метода анонимного класса в Java возвращают управление в код, вызвавший эту функцию. А в ST происходит возврат из того метода, где был блок определён. Отсутсвие этой фичи делает невозможным реализацию аналога at:ifAbsent: в Java и C#.