Oberon space
General Category => Общий раздел => Тема начата: ilovb от Сентябрь 24, 2012, 12:31:11 pm
-
Вот прям сейчас напоролся на свою ошибку. Не то чтобы критично, но минуты 3 искал в другом месте. :)
...
Начисление = Начисления.Добавить();
Начисление.ОбъектСети =
Начисление.Номенклатура = ТекВидУслуги.Номенклатура;
Начисление.Объем = Остаток;
...
В результатах объект сети не был заполнен, но по логике алгоритма такого быть не должно.
Естественно синтаксический контроль сие скушал. А так как типизация динамическая, то и в рантайме ошибки нет... :)
-
Вот прям сейчас напоролся на свою ошибку. Не то чтобы критично, но минуты 3 искал в другом месте. :)
Сабж тут не причем. Если в языке присваивание является выражением (expression vs statement) - будет такая фигня. Еще можно припомнить значащее форматирование - вот в динамическом питоне такое не пройдет ;)
-
Ну почему же?
Если бы присваивание было как в паскалях, то синтаксис контроль меня бы обругал.
...
Начисление := Начисления.Добавить();
Начисление.ОбъектСети :=
Начисление.Номенклатура := ТекВидУслуги.Номенклатура;
Начисление.Объем := Остаток;
...
-
Ну почему же?
Если бы присваивание было как в паскалях, то синтаксис контроль меня бы обругал.
...
Начисление := Начисления.Добавить();
Начисление.ОбъектСети :=
Начисление.Номенклатура := ТекВидУслуги.Номенклатура;
Начисление.Объем := Остаток;
...
Не обругал бы. Положил бы значение "ТекВидУслуги.Номенклатура" и в "Начисление.Номенклатура" и в "Начисление.ОбъектСети". В паскале/обероне как раз различается expression и statement. assignment - это statement и не может использоваться как часть expression. Но expression это часть assignment (которая справа после ':=').
-
Ну почему же?
Или в 1C вообще не разлчаются значки присваивания и сравнения? Тогда все вообще запущенно :)
-
Ага. Один и тот же знак "=" :)
Например:
a = 1;
b = 2;
c = a = b;
В "c" будет false
-
Не обругал бы. Положил бы значение "ТекВидУслуги.Номенклатура" и в "Начисление.Номенклатура" и в "Начисление.ОбъектСети". В паскале/обероне как раз различается expression и statement. assignment - это statement и не может использоваться как часть expression. Но expression это часть assignment (которая справа после ':=').
Туго соображаю... Если различаются, то почему не обругал бы? В expression допустим знак ":="?
Блин, надо BNF смотреть.
-
Ага. Один и тот же знак "=" :)
Например:
a = 1;
b = 2;
c = a = b;
В "c" будет false
рукалицо!
По моему, 1C, как язык, проектировали руководствуясь worst practices.
-
Ага. Один и тот же знак "=" :)
Тогда не обращай внимание на то, что я написал ;) Этому языку уже ничто не поможет :)
-
c = a = b;
нда. говнецо ,ilovb - учитывая ваши слова о родственности этого языка шарпею , я бы подумал что это цепочное присваивание . Забавно, что на такое говнецо подсаживают людей которые не имеют практики программирования (будто у них других проблем нет)
-
c = a = b;
нда. говнецо ,ilovb - учитывая ваши слова о родственности этого языка шарпею , я бы подумал что это цепочное присваивание . Забавно, что на такое говнецо подсаживают людей которые не имеют практики программирования (будто у них других проблем нет)
А оно еще и динамически типизированное! То есть если бы была статическая типизация, львиная дола ошибок была бы отловлена на этапе компиляции даже при таком синтаксисе.
-
c = a = b;
нда. говнецо ,ilovb - учитывая ваши слова о родственности этого языка шарпею , я бы подумал что это цепочное присваивание . Забавно, что на такое говнецо подсаживают людей которые не имеют практики программирования (будто у них других проблем нет)
А оно еще и динамически типизированное! То есть если бы была статическая типизация, львиная дола ошибок была бы отловлена на этапе компиляции даже при таком синтаксисе.
это то ладно, вы мне скажите как должно интерпретироваться:
с=b=a=d
или это ошибка?
-
c = a = b;
нда. говнецо ,ilovb - учитывая ваши слова о родственности этого языка шарпею , я бы подумал что это цепочное присваивание . Забавно, что на такое говнецо подсаживают людей которые не имеют практики программирования (будто у них других проблем нет)
А оно еще и динамически типизированное! То есть если бы была статическая типизация, львиная дола ошибок была бы отловлена на этапе компиляции даже при таком синтаксисе.
это то ладно, вы мне скажите как должно интерпретироваться:
с=b=a=d
или это ошибка?
Зависит от конкретной грамматики. И семантики. Нужно смотреть на ассоциативность присваивания, на то возвращает оно lvalue или rvalue и так далее. Дьявол в деталях.
-
Зависит от конкретной грамматики. И семантики. Нужно смотреть на ассоциативность присваивания, на то возвращает оно lvalue или rvalue и так далее. Дьявол в деталях.
;) подождем разъяснений эксперта -"одынэссника" - лично я считаю что в этом случае должна генерироваться ошибка... (выражение может содержать только один оператор присваивания)
-
хотя нет, даже в этом случае:
b=a=d
может трактоваться как цепочное сравнение...
короче.. говнецо с какой стороны не подходи..
-
INT x, y;
x :=
y := 5;
print ((x, y))
---------- Algol-68 G ----------
+5 +5
Казалось бы, причём тут "=" vs ":=" о_О
-
:) не понял? к чему это вы..- в вашем примере обычное цепочное присваивание...
-
это то ладно, вы мне скажите как должно интерпретироваться:
с=b=a=d
или это ошибка?
"c=" - присваивание
"b=a=d" - выражение
Слева направо: ((b=a) = d)---> результат типа булево
Например:
a = 1;
b = 1;
d = 2;
1) (b=a) = true
2) (true = 2) = false
т.е.
с=b=a=d
с=1=1=2 --> false
но:
c=1=1=1 --> true
т.к. в 1С принято что:
true = 1
false = 0
т.е. если сравниваем булеву переменную с числовой, то вторая будет интерпретироваться как булево если она равна 1 или 0 (наследие 1С 7.7, там типа булево вообще не было)
имеем:
для c=1=1=1 ---> c=((1=1)=1)
(1=1) = true
(true=1) = (true=true) = true
т.е.
c=2=2=1 ---> true
c=2=2=2 ---> false
c=1=2=0 ---> true
-
INT x, y;
x :=
y := 5;
print ((x, y))
---------- Algol-68 G ----------
+5 +5
Казалось бы, причём тут "=" vs ":=" о_О
Ну алгол 68 это да... :)
Вот PABC матерится.
-
c = a = b;
нда. говнецо ,ilovb - учитывая ваши слова о родственности этого языка шарпею...
Не не не. Я говорил про родственность VB :D
-
VBS аналогично:
a = 2
b = 2
d = -1
c = a = b = d
MsgBox(c) ' --> true
a = 2
b = 1
d = 0
c = a = b = d
MsgBox(c) ' --> true
a = 1
b = 1
d = 1
c = a = b = d
MsgBox(c) ' --> false
Только в отличие от 1С:
true = -1
-
Вот PABC матерится.
и правильно делает - вот если бы он назывался шРАBСом..
-
"c=" - присваивание
"b=a=d" - выражение
Слева направо: ((b=a) = d)---> результат типа булево
......
Понятно - цепочные присваивания запрещены, цепочные сравнения разрешены(при совпадении обозначений операторов равенства и присваивания)- говно, короче... бедные 1С ники... и чего там AlexUs возмущался... --какое нахрен изучение MSsql - и без этого проблем хватает :) А может это специально создатели 1С ввели , ну чтобы внимание у программистов 1С не рассредотачивалось на всякие побочные технологии? ;D
-
надо , это... предложить использовать 1с никам PABC вместо их чуда -языка :)
-
хотя не.. не пойдет вследствие отсутствия русских идентификаторов и служебных слов ...PABC будет слишком сложен для основной массы 1С -программистов коих уже состав и пригоршня вагонов расплодилось :D
-
Это ещё не все сюрпризы этого недо-языка. Например, если где-то объявлена глобальная переменная Х, в в подпрограмме - локальная Х, то все обращения к Х касаются именно глобальной переменной.
-
Это ещё не все сюрпризы этого недо-языка. Например, если где-то объявлена глобальная переменная Х, в в подпрограмме - локальная Х, то все обращения к Х касаются именно глобальной переменной.
Ой ля -ля а вот это уже очень херово - по сути дела речь идет о том, что нельзя нормально провести декомпозицию сложной задачи в несколько простых.... вообще говоря, я встречал подобные казусы в "подельных" скриптовых языках - не предназначенных для написания чего -то законченного (играющих роль клея для связывания готовых самостоятельных блоков)...
-
IDE там интеллектуальная. Я сперва недоумевал, как в динамическом языке по нажатию "." отображаются методы и свойства объекта в текущем контексте. Оказалось всё банально.
Во-первых, если объект создан с нуля (структура), то вигвам, запоминайте список полей в голове или пишите в комментариях. Во-вторых, тип переменной берётся из последнего присваивания:
Если Истина Тогда А = Новый Массив();
Иначе А = 7; КонецЕсли
А. // Здесь Конфигуратор не отобразит список методов объекта Массив, т.к А для него - Число
Если Истина Тогда А = 7;
Иначе А = Новый Массив(); КонецЕсли
А. // А здесь отобразит, хотя А - не объект