M>Но первый барьер — это понимания смысла операции присваивания.
Золотые слова!
M>И в преодолении этого барьера символ = не помогает.
Но и не мешает, что самое главное!
Математика:
f(x) = 2x + 1
a = f(2)
b = f(4)
a + b = ?
Во второй и третьей строчке — именно присваивание. И никаких проблем оно не вызывает.
M>Не понимаю, это ведь очевидно, о чем здесь спорить? Если в китайском, напрмиер, стол будет называться стулом, то это точно не поможет в постижении сужности стола.
Именно! И если операция присваивания будет обозначаться знаком =, := или <-, легче от этого никак не станет.
M>Хотя любому из Вас это ясно, от того что вы это знаете!!! Я это понял и осознал, как понял и осознал знак = в си и := в паскале.
M>Ну хорошо, вопрос ведь не в этом, а в том, насколько легче было бы прийти к такому осознанию, если бы использовалось графическое изображение, интуитивно сообразующееся со смыслом операции присваивания.
Какое?
[skip]
M>Главное то, суть познать! Как хотите здесь плюйтесь, но чтобы получить 6 + 7 = 13, нужно Z>>
Z>>write(6+7);
Z>>
Z>>ну а это НИКАК с матиматикой не согласуется
M>Почему не согласуется? Вполне себе нормальная композиция двух функций: write и +.
Композиция, это которая (g o f)(x) = (g(f(x)))? Ну так в Паскале она даже близко на такую не похожа. Должна быть, как минимум, такая:
write(+(6 7))
Тогда — да, композиция Тем более, что в Паскале это называли, по-моему, всегда опреаторами. Это в С++, да еще и в универе, да еще и не на самом первом курсе, когда изучается что-то типа Introduction to C++ 102, когда изучается перегрузка функций — тогда только приходит понимание — а! оно ж тоже функция!
В функциональных языках с этим легче. Ну так они и претендуют на следование определенным математическим моделям.
Здравствуйте, McSeem2, Вы писали:
MS>Я не знаю, что такое Оберон, но однозначно могу сказать, что на комплексных числах Фортран кроет С++ по скорости. И иначе быть не может, поскольку комплексные числа — это встроенный тип в Фортране и оптимизатор все про них знает. А в C++ это некий класс, просто класс. Класс как класс и всех делов.
"однозначно могу сказать" == моё большое IMHO
In a comparison of FORTRAN-77 and C++, Kent Budge and his associates programmed a complex number test case in both languages. (complex is a built-in type in FORTRAN; in C++, it is a concrete class with two members, one real and one imaginary. Standard C++ has made the complex class part of the standard library.)
...
Time comparisons against the FORTRAN-77 code showed the FORTRAN code to be nearly twice as fast. Their first assumption was to blame the temporaries. To verify that, they hand-eliminated all temporaries in the intermediate cfront output. As expected, the performance increased two-fold and equaled that of FORTRAN-77.
(C) Inside the C++ Object Model, Stanley B. Lippman
Здравствуйте, Mamut, Вы писали:
СГ>>Система программирования Mathematica отличилась тем, что неравенство обозначается именно так как в математике:
M>Ндяяя... Вводится или дополнительным кликом по тулбару или комбинацией клавиш, я так понимаю.
Все проще :)
Там за основу принята нотация LaTeX, т.е. формулы пишутсяn не особо медленнее, чем в техе.
И ели тебе нужно ввести нечто нетривиальное, нажимаешь Esc (появляется символ типа двоеточия), потом пишешь, что тебе нужно (!= или там HypergeometricP) и повторным Esc закрываешь все, что написал — оно преобразуется в символ (если нигде не ошибся). Соответственно, в процессе написания можно и подредактировать, если где опечатался. Причем таких красот можешь еще и своих нагенерить, если разрабатываешь нечто новое со своей системой обозначений. Очень удобно.
Ну, конечно же, можно и комбинацию клавиш ввести, но это уже для настоящих маньяков :)
M>>Во второй и третьей строчке — именно присваивание.
СГ>Нет, уравнения.
СГ>Это система уравнений:
Никакая эта не система уравнений Ну, то есть да, но. a = f(2) — это не равенство, f(2) != a. Мы присваеваем символу а значение, вычисляемое функцией f с заданными параметрами. Здесь знак = имеет абсолютно такое же значение, как и в:
int f(x)
{
return 2*x + 1;
}
void main()
{
int a, b;
a = f(2);
b = f(4);
cout << (a + b);
}
M>>Ну, то есть да, но. a = f(2) — это не равенство, f(2) != a.
G>Т.е. Вы утверждаете, что запись вида: G>
G>2x + 1 = f(x)
G>f(2) = a
G>f(4) = b
G>? = a + b
G>Не верна?
"Во валит, гад" (с) анекдот
Возможно, с точки зрения математика, она и верна. Но "простому рабочему парню" непонятна — a и b еще ж "не инициализированы"
Ну, для меня лично, как минимум, a = f(2) в математике всегда означало присвоение. Даже еще в те времена, когда я и программировать-то не мог. И в обратном вы меня не переубедите
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, CreatorCray, Вы писали:
F>>>>Остроумна критика операторов ++/-- (Вирт считает, что это уродство). GZ>>>Я тоже. CC>>Обоснуй почему это уродство... Только тем, что можно писать x+++y ? Тогда русский язык с его "Казнить нельзя помиловать" тоже есть уродство. Запятая надо что понять смысл? Точно так же простой пробел исправит непонятки: x++ +y или x+ ++y GZ>Когда быстро читаешь текст, подобные операции малозаметны. И всегда приходится дополнительно задумываться, чтобы это значило. Что сначало приплюсовало, или что-то другое. Поэтому я очень редко их вставляю не на новой строке. И пользуюсь только x++; Выражения типа while(*x++==*y++) для меня слишком сложны. Такой я глупый программист.
Хорошо еще, что нельзя писать x+++++y. Хотя, если пробелы поставить, то работает (x++ + ++y)
Здравствуйте, Mamut, Вы писали:
M>Никакая эта не система уравнений Ну, то есть да, но. a = f(2) — это не равенство, f(2) != a. Мы присваеваем символу а значение, вычисляемое функцией f с заданными параметрами. Здесь знак = имеет абсолютно такое же значение, как и в:
Ты путаешь присваивание с декларацией, и вообще воспринимаешь математику как императивный ЯП. Это принципиальная разница:
M>a = f(2) — это не равенство
это равенстно, _по определению_ Такова математическая запись равенства (... = ...)
M>f(2) != a
Ошибаешься. Они равны. f(2) = a, это тоже равенстно. По определению, "a = b" и "b = a" всегда одновременно либо выполняются, либо не выполнятся, для любых a и b.
M>Мы присваеваем символу а значение, вычисляемое функцией f с заданными параметрами
Это вообще чудовищно В математике, запись "a = f(2)" вообще никакого вычисления значения не производит! Ни сразу, ни потом, никогда. В записи "a = f(2)" не кроется понятия "вычисление значения и передача его куда-то". Тут просто написано, что "а" и "f(2)" — одно и то же.
Вот это:
f(x) = 2x + 1
a = f(2)
b = f(4)
Описание некого виртуального мира. Просто описание. В отличие от ЯП, никаких вычислений этим описанием не производится.
Это описание является достаточным, чтобы a + b было определено в этом же мире, и имело одно конкретное значение. Если тебе хочется, ты можешь вычислить "a + b" любым способом. Например, сначала подсчитать f(2), затем f(4), затем сумму. Или, преобразовать "a + b" -> "f(2) + f(4)" -> "2*2 + 1 + 2*4 + 1" -> "4 + 1 + 8 + 1" -> "14". Это разные подходы. Описание не навязывает никакого подхода вообще.
Попробуй покурить вот это:
a = b + 1
b = a + 1
Тебе не удастся думать об этом, как о "присвоении `а` значения, которое вычисляется прибавлением к значению `b` единицы", т.к. b определяется через значение a, которое ещё не вычислено. А вот в математике это просто напросто подразумевает, что a = b = 0, не более того. Если ты подумаешь об этом как о "присвоениях вычисленного значения", ты никогда не получишь значений 0 одновременно в a и b.
M>Но и не мешает, что самое главное! M>Математика: M>f(x) = 2x + 1 M>a = f(2) M>b = f(4) M> M>a + b = ? M> M>Во второй и третьей строчке — именно присваивание. И никаких проблем оно не вызывает.
Проблем с записями вида "a = b" нет ни в математике, ни в ЯП. Но означают они обычно кардинально разные вещи А проблемы у того, кто желает кормить компилятору Паскаля то же самое, что написано у него в тетрадке по математике. Но это будет тоже самое, как если кто-то захочет кипятить воду в холодильнике. То что и в холодильнике, и в печке есть место для кастрюли с водой, совершенно ничего не значит.
Вот вот! теоретики всегда забывают что ПИСАТЬ И ЧИТАТЬ "}" легче чем "end" и "=" легче чем ":=" , особенно забывая , что это одни из самых используемых операций
Кодёнок,
Кё>>Попробуй покурить вот это: Кё>>a = b + 1 Кё>>b = a + 1
Кё>Извините, я фигню написал.
Да нет, нормально: если мы будем рассматривать решения в циклической группой порядка 2, то смысл очень даже появляется. Если даже будем рассматривать решения в поле вещественных чисел R, то смысл опять же есть:
Значок = — это отношение. Отношение R(x,y) — это подмножество декартового произведения X x Y.
Значок + — это отображение. Отображение f: X -> Y — это... гхм.. отображение (неопределяемое понятие)
Последовательность символов
a = b + 1
есть отношение R(a, f(b)), где R — отношение равенства, f(b) — отображение прибавляющее единицу
Аналогично, последовательность символов
b = a + 1
есть отношение R(f(a), b).
Наконец,
a = b + 1
b = a + 1
есть пересечение множеств R(a, f(b)) и R(f(a), b).
То есть этими двумя равенствами ты описал подмножество декартового произведения A x B (a \in A, b \in B), а не фигню.
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>Хотя, если пробелы поставить, то работает (x++ + ++y)
Так у Вирта в статье как раз такая галиматья и критикуется:
Уродство конструкции обычно проявляется в комбинации с другими средствами языка. На языке C программист может написать конструкцию x+++++y, загадку, а не выражение, представляющую проблему даже для сложного синтаксического анализатора. Равняется ли значение этого "выражения" значению ++x+++y+1? Верны ли следующие соотношения?
x+++++y+1==++x+++y
x+++y++==x+++++y+1
Так можно было бы постулировать новую алгебру. Я нахожу совершенно удивительной невозмутимость, с которой мировое сообщество программистов приняло этого нотационного монстра. В 1962 г. установившиеся традиции аналогичным образом подорвало постулирование правой ассоциативности операций в языке APL. Тогда x+y+z неожиданно стало обозначать x+(y+z), а x-y-z — x-y+z.
Здравствуйте, Кодт, Вы писали:
К>В языке Васик для микроэвм Ириша вместо $ использовалась черепашка ¤ — по той же причине.
Я думаю это было из-за того, что СССР не воспринимал буржуазные символы. На Искрах и на УКНЦ-ВМ та же самая черепашка была.
Тырили у загнивающего капитализма и добавляли капельку патриотичности (i8080 -> КР580ВМ80А, PDP-11 -> БК0010(К1801ВМ1), и т.д.)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
Кё>>Извините, я фигню написал.
LCR>То есть этими двумя равенствами ты описал подмножество декартового произведения A x B (a \in A, b \in B), а не фигню.
Я на самом деле хотел показать простой пример с конкретными вещественными значениями, так чтобы их вычисление не сводилось к выполнению равенств как присваиваний. Потому говорю — фигня вышла
Кодёнок,
Кё>Я на самом деле хотел показать простой пример с конкретными вещественными значениями, так чтобы их вычисление не сводилось к выполнению равенств как присваиваний.
WH>Про жабу ничего не знаю но есть слухи что C# делают 4 человека.
Anders Hejlsberg: The original C# design team was Scott Wiltamuth, Peter Golde, Peter Sollich, Eric Gunnerson, and myself. The C# 2.0 design team is Peter Hallam, Shon Katzenberger, Todd Proebsting, and myself. Most of the credit for generics goes to Don Syme and Andrew Kennedy from Microsoft Research.