Re[7]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 07:35
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Ну-ну. А разве CObject имеет поле Config? А? Или может быть поле User. Или может быть CObject можно сравнивать с int (c 16)? Чушь!


FDS>>Root.Config инициализированно? — нет — выйти из условного оператора


FDS>>Root.?Config.?User инициализированно? — аналогично


S>
S>if (!(Root.?Config.?User.?Age > 16))
S>    ...;
    
S>if ((Root.?Config.?User.?Age > 16) || someBoolVar)
S>    ...;
    
S>bool x = (Root.?Config.?User.?Age > 16);
S>


S>Дык откуда ты говоришь надо сразу выходить?


Повторяю, из условного оператора "if"
Re[8]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 07:39
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Здравствуйте, stalcer, Вы писали:


S>>Ну-ну. А разве CObject имеет поле Config? А? Или может быть поле User. Или может быть CObject можно сравнивать с int (c 16)? Чушь!


Я имею ввиду, что для компилятора проверяемое поле — указатель на базовый тип
Re[7]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 07:43
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>Людям явно не нравится механизм обработки исключений и они ощут альтернативы


Что ж я каждый условный оператор в try .. extept (cath) должен ставить?
Re[8]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 07:45
Оценка:
Здравствуйте, FDSC, Вы писали:

S>>Дык откуда ты говоришь надо сразу выходить?


FDS>Повторяю, из условного оператора "if"


Повторяю примеры:

if (!(Root.?Config.?User.?Age > 16))
    ...;
    
if ((Root.?Config.?User.?Age > 16) || someBoolVar)
    ...;
    
bool x = (Root.?Config.?User.?Age > 16);


Во первых, в первых двух if должен выполниться (при условии, что someBoolVar = true). Во вторых, в третьем примере вообще нет if. И?
http://www.lmdinnovative.com (LMD Design Pack)
Re[8]: С# 3.0
От: Кодёнок  
Дата: 16.09.05 07:49
Оценка: +1
Здравствуйте, FDSC, Вы писали:

FDS>Повторяю, из условного оператора "if"


А вообще интересная идея — считать условие невыполненным, если оно не может быть вычислено (а не тупо сравнивать числа).

Если нас это устраивает, мы просто пишем
if (a.b > 10)

Если надо наоборот — чтобы оно выполнилось в случае невычислимости, то пишем
if (!(a.b <= 10))

Проблема в том, что будут ситуации, когда некоторые случаи невычислиости должны обязательно выкидывать исключение. Т.е. если a.b === null — исключение, а если a.b.c === null — считать условие невыполненным. И еще не ко всякому условию можно записать обратное через !(...)
Re[9]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 07:49
Оценка:
Здравствуйте, stalcer, Вы писали:


S>
S>if (!(Root.?Config.?User.?Age > 16))
S>    ...;
    
S>if ((Root.?Config.?User.?Age > 16) || someBoolVar)
S>    ...;
    
S>bool x = (Root.?Config.?User.?Age > 16);
S>


S>Во первых, в первых двух if должен выполниться (при условии, что someBoolVar = true). Во вторых, в третьем примере вообще нет if. И?


Последние два примера не корректны для данной постановки задачи.
Re[9]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 07:55
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Я имею ввиду, что для компилятора проверяемое поле — указатель на базовый тип


Ты ответь на мой вопрос. Какого типа, с точки зрения предполагаемой спецификации языка должно быть каждое из перечисленных мной выражений. И какое значение каждое из них должно вернуть. Особенно <...>.?Age.

С точки зрения логики. Ведь именно с этой точки зрения мы обсуждаем введение нового типа выражения ".?" в язык.

Его синтаксис можно обозначить так:

<primary> ".?" <field-name>

Где <primary> — это тоже выражение. Вот и объясни мне правила выисления этого выражения вне зависимости от контекста (наличия if, ect.). Объясни также как это объяснено для других выражений в спецификации.
http://www.lmdinnovative.com (LMD Design Pack)
Re[9]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 07:58
Оценка: +1
Здравствуйте, Кодёнок, Вы писали:

Кё>Проблема в том, что будут ситуации, когда некоторые случаи невычислиости должны обязательно выкидывать исключение. Т.е. если a.b === null — исключение, а если a.b.c === null — считать условие невыполненным. И еще не ко всякому условию можно записать обратное через !(...)



Тогда можно записать так a.b.?c вместо a.?b.?c. Если b == NULL — в первом случае будет поднято исключение
Re[10]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 08:00
Оценка:
Здравствуйте, FDSC, Вы писали:

S>>
S>>if (!(Root.?Config.?User.?Age > 16))
S>>    ...;
    
S>>if ((Root.?Config.?User.?Age > 16) || someBoolVar)
S>>    ...;
    
S>>bool x = (Root.?Config.?User.?Age > 16);
S>>


FDS>Последние два примера не корректны для данной постановки задачи.


Почему это, интересно знать?

Пучть Root = null, а someBoolVar = true.
Второй пример: должно получиться if (false || true), т.е. if должен выполниться.
Третий пример: x = false;

Все корректно. И вообще, любое выражение я могу применять в любом контексте. Из любых более мелких выражений я могу конструировать более сложные.
http://www.lmdinnovative.com (LMD Design Pack)
Re[11]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:05
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Здравствуйте, FDSC, Вы писали:


S>>>
S>>>if (!(Root.?Config.?User.?Age > 16))
S>>>    ...;
    
S>>>if ((Root.?Config.?User.?Age > 16) || someBoolVar)
S>>>    ...;
    
S>>>bool x = (Root.?Config.?User.?Age > 16);
S>>>


FDS>>Последние два примера не корректны для данной постановки задачи.


S>Почему это, интересно знать?


Согласен. Всякий синтаксически правильный код — корректен.

S>Пучть Root = null, а someBoolVar = true.

S>Второй пример: должно получиться if (false || true), т.е. if должен выполниться.
S>Третий пример: x = false;

S>Все корректно. И вообще, любое выражение я могу применять в любом контексте. Из любых более мелких выражений я могу конструировать более сложные.


Кодёнок предложил считать условие не выполненным, если соотв. значение некорректно.
Тогда всё получается.
Re[10]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:09
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Его синтаксис можно обозначить так:


S><primary> ".?" <field-name>


S>Где <primary> — это тоже выражение. Вот и объясни мне правила выисления этого выражения вне зависимости от контекста (наличия if, ect.). Объясни также как это объяснено для других выражений в спецификации.


В общем, примерно так:

<object1>.?<Object2> == if (Object1.Object != NULL) ... ; else return false;
Re[12]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 08:11
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Кодёнок предложил считать условие не выполненным, если соотв. значение некорректно.

FDS>Тогда всё получается.

Неа. Вот это:
bool x = (Root.?Config.?User.?Age > 16);


Я перепишу так:

int  age = Root.?Config.?User.?Age;
bool x   = (age > 16);


Утверждаю, что это должно быть абсолютно эквивалентно первому варианту. Об этом даже спорить не буду.

Вопрос 1: правильно ли я объявил переменную age типа int. Или должен быть другой тип?
Вопрос 2: чему будет равно значение переменной age?
http://www.lmdinnovative.com (LMD Design Pack)
Re[11]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 08:17
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>В общем, примерно так:


FDS><object1>.?<Object2> == if (Object1.Object != NULL) ... ; else return false;


А вот и фигушки. Для начала расшифрую твое многоточие. Ты, наверное, имел ввиду следующее:

if (Object1.Object2 != NULL) return Object1.Object2; else return false;

А вот теперь подумай:

<EpressionType> retval;

if (Object1.Object2 != NULL) 
    retval = Object1.Object2; 
else 
    retval = false;
    
return retval;


Каким должен быть <EpressionType>? С одной стороны — типом поля Object2. С другой стороны по твоей логике — bool (так как ты ему false присваиваешь). Как я и говорил — чушь.
http://www.lmdinnovative.com (LMD Design Pack)
Re[13]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:18
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Неа. Вот это:

S>
S>bool x = (Root.?Config.?User.?Age > 16);
S>


S>Я перепишу так:


S>
S>int  age = Root.?Config.?User.?Age;
S>bool x   = (age > 16);
S>


S>Утверждаю, что это должно быть абсолютно эквивалентно первому варианту. Об этом даже спорить не буду.

Согласен...

S>Вопрос 1: правильно ли я объявил переменную age типа int. Или должен быть другой тип?

S>Вопрос 2: чему будет равно значение переменной age?

Честно говоря, не знаю, как это правильно объявить. Но оператор .? должен возвращать булевский тип. Вообще-то ерудна получается.

Надо долго думать...
Re[12]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:22
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Здравствуйте, FDSC, Вы писали:


FDS>>В общем, примерно так:


FDS>><object1>.?<Object2> == if (Object1.Object != NULL) ... ; else return false;


S>А вот и фигушки. Для начала расшифрую твое многоточие. Ты, наверное, имел ввиду следующее:


S>if (Object1.Object2 != NULL) return Object1.Object2; else return false;


S>А вот теперь подумай:


S>
S><EpressionType> retval;

S>if (Object1.Object2 != NULL) 
S>    retval = Object1.Object2; 
S>else 
S>    retval = false;
    
S>return retval;
S>


S>Каким должен быть <EpressionType>? С одной стороны — типом поля Object2. С другой стороны по твоей логике — bool (так как ты ему false присваиваешь). Как я и говорил — чушь.


Правильно.

Надо ввести тогда оператор .? ... .?... условие . Тогда оператор станет возвращать bool в обоих случаях. Только как это сделать?
Re[14]: С# 3.0
От: Кодёнок  
Дата: 16.09.05 08:30
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Честно говоря, не знаю, как это правильно объявить. Но оператор .? должен возвращать булевский тип. Вообще-то ерудна получается.


FDS>Надо долго думать...


Нет, оператор не дожен возвращать никакой тип, иначе ничего не выйдет Именно это мне и показалось интересным — не простое вычисление выражения в операторе if по правилам языка, а какое-то более сложное поведение, в данном случае — считать само условие невыполненным в случае невозможности вычислить аргументы.

Т.е. этот код
if (Object1.?Object2.?Object3)
  DoSmth();


должен транслироваться в

if (Object1 != null && Object1.Object2 != null)
{
  if (Object1.Object2.Object3)
    DoSmth();
}


Т.е. .? не просто оператор, который ведет себя каким-то хитрым образом, а изменение поведения компилятора.

Проблема тут сразу очевидна — как отличить "провал" оператора .? от нормального выполнения? Что если провал одного из операторов должен приводить к невыполнению всего условия, а провал другого — к выполнению всего условия? Еще проблема — если этот оператор влияет на способ всего вычисления выражения в if, то могут быть какие-нибудь неочевидные проблемы.
Re[15]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:39
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>Т.е. .? не просто оператор, который ведет себя каким-то хитрым образом, а изменение поведения компилятора.


Кё>Проблема тут сразу очевидна — как отличить "провал" оператора .? от нормального выполнения? Что если провал одного из операторов должен приводить к невыполнению всего условия, а провал другого — к выполнению всего условия? Еще проблема — если этот оператор влияет на способ всего вычисления выражения в if, то могут быть какие-нибудь неочевидные проблемы.


Я собственно то же это хотел. Но возникает вопрос синтаксиса при использовании оператора .? вне оператора if.

Можно ввести разновидность оператора .? и .~?, которые будут всё-таки возвращать булевский тип для определённого условия, но работать только в команде с условием.

a.b = NULL;
a.?b = true
a.~?b = false
Re[15]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 08:43
Оценка: +1
Здравствуйте, Кодёнок, Вы писали:

Кё>...то могут быть какие-нибудь неочевидные проблемы.


Очевидная проблема, в том, то невозможно формально описать логику поведения такого оператора.
Возможно только если он выполняется обычным образом, и в нашем примере (с Age) возвращает 0 (ноль) типа int.

То есть пусть Object1.?Age выполняется так:
if (Object1 != null)
    return Object1.Age;
else
    return (AgeType)default_value;


Где, AgeType — тип поля Age, а default_value — значение, зависящее от AgeType. Для ссылочных типов default_value = null, для числовых — 0, для строки — "", для структур — ??? может структура забитая нулями.

Это, ИМХО, единственный нормальный способ описать поведение такого оператора. Только не очень красиво, Age может быть и так равен нулю.

Или же расширить синтаксис до такого, например: Object1.?Age{7}, что будет означать, то вместо default_value использовать 7.
http://www.lmdinnovative.com (LMD Design Pack)
Re[16]: С# 3.0
От: FDSC Россия consp11.github.io блог
Дата: 16.09.05 08:49
Оценка:
Здравствуйте, stalcer, Вы писали:

S>Здравствуйте, Кодёнок, Вы писали:


Кё>>...то могут быть какие-нибудь неочевидные проблемы.


S>Очевидная проблема, в том, то невозможно формально описать логику поведения такого оператора.

S>Возможно только если он выполняется обычным образом, и в нашем примере (с Age) возвращает 0 (ноль) типа int.

S>То есть пусть Object1.?Age выполняется так:

S>
S>if (Object1 != null)
S>    return Object1.Age;
S>else
S>    return (AgeType)default_value;
S>


S>Где, AgeType — тип поля Age, а default_value — значение, зависящее от AgeType. Для ссылочных типов default_value = null, для числовых — 0, для строки — "", для структур — ??? может структура забитая нулями.


S>Это, ИМХО, единственный нормальный способ описать поведение такого оператора. Только не очень красиво, Age может быть и так равен нулю.


S>Или же расширить синтаксис до такого, например: Object1.?Age{7}, что будет означать, то вместо default_value использовать 7.


Не пойдёт! К сожалению. Смысл в том, что оператор должен прекращать выполнение обработки условного выражения, а не возвращать значение по умолчанию. Как тогда справиться с последовательным вызовом a.?b.?c.? Хранить "нулевые" объекты-значения по умолчанию?
Re[17]: С# 3.0
От: stalcer Россия  
Дата: 16.09.05 08:59
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Не пойдёт! К сожалению. Смысл в том, что оператор должен прекращать выполнение обработки условного выражения, а не возвращать значение по умолчанию. Как тогда справиться с последовательным вызовом a.?b.?c.? Хранить "нулевые" объекты-значения по умолчанию?


А чего не пройдет-то? С последовательным вызовом как раз все нормально. Например, a.?b.?c.?Age
Пусть поле 'b' будет равно null.

1) A tmp1 = a; // not null
2) B tmp2 = (tmp1 != null) ? tmp1.b : null; // a.b (== null)
3) C tmp3 = (tmp2 != null) ? tmp2.c : null; // null, так как tmp2 == null
4) int tmp4 = (tmp3 != null) ? tmp3.Age : 0; // 0, так как tmp3 == null

Результат будет 0 (ноль).
http://www.lmdinnovative.com (LMD Design Pack)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.