Здравствуйте, Beam, Вы писали:
FDS>>Не знаю, как для Явы, а для C# — это нормально. B>Позвольте в Вами не согласиться. B>Если это нормально, то почему обход коллекции в большинстве случаев производится вручную, т.е. с помощью цикла. B>Ведь можно создать метод forEach и, подставляя нужный кусок кода, бегать по коллекции. Однако, чего-то не видно всего этого в коде.
Смотрим внимательно на List<T>.ForEach(Action<T> action).
B>Зато пошли по пути расширения языка. Надоело программистам все время писать код обхода коллекции — в язык добавили foreach. Отлично! Скоро добавим ключевые слова select, collect, detect и т.п.
select точно скоро будет.
B>В C# все таки отступили от правил — изменили синтаксис. B>В 1.0 там появились делегаты, это уже объект, ссылка на метод. Прогресс, но все равно не удобно. B>Затем в 2.0 — появились анонимные методы. Удобно, но все еще слишком длинно. B>И вот, наконец в 3.0 — лямбда. Вроде должно быть все ок.
B>Вот так, долго-долго шли к тому, что появилось очень давно. И, кстати, еще не дошли.
И в чём проблема? Пусть долго, но ведь дошли. В результате мы получили не просто отдельно мэйнсрим, а отдельно лямбды. Мы получили всё вместе. Или и это не устраивает?
Да и почему собственно долго? C# от роду чуть больше 4-х лет. Когда выйдет C# 3.0 ему будет 5 лет. Это много для языка?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, Дарней, Вы писали:
ГВ>>>Этот постинг улыбнул меня своей пионерской наивностью. Я даже не нашёлся, что ответить. Д>>Ты лучше не о чужой наивности рассуждай, а хоть что-нибудь по делу скажи. Для разнообразия.
ГВ>По какому ещё делу? Нет никакой связи между мощностью Lisp и волнами стартапов. Нет и быть не может. Мощность Lisp — это характеристика инструмента. Чтобы возникла "волна стартапов" нужно много чего, кроме самого инструмента. Если ты думаешь, что раз нет волны, то и преимущества Lisp "высосаны из пальца" — разубеждать не буду.
Что же это за преимущества, которые не дают экономических преимуществ при разработке ПО? И зачем они такие нужны?
Не уж, раз вы залезли в спор, дак не прекращайте его аргументом "мне стало неинтересно". Лучше скажите, что вы не знаете, что сказать. А если знаете, так сделайте полезное дело — поделитесь знаниями, иначе для чего вообще форум нужен?
> Если речь идёт про тривиальное for (int i = 0; i < object.Length; i++) — то нет. Это, собственно, не дублирование кода. Не считаете же вы дублированием кода вызов одной и той же функции или применение одного и того же оператора
Любой паттерн, в котором изменяется незначительная часть — это дублирование.
>> Если речь идёт про тривиальное for (int i = 0; i < object.Length; i++) — то нет. Это, собственно, не дублирование кода. Не считаете же вы дублированием кода вызов одной и той же функции или применение одного и того же оператора PA>Любой паттерн, в котором изменяется незначительная часть — это дублирование.
отлично, расскажите мне тогда, как избавиться от вызовов функций?
А что, foreach(EnumeratorObject EO in Enumerator) — это не дублирование. Давайте избавимся от дублирования! И каждая программа будет занимать по 5 строчек.
FDSC wrote: > PA>Любой паттерн, в котором изменяется незначительная часть — это дублирование. > отлично, расскажите мне тогда, как избавиться от вызовов функций?
Очень просто, если этих вызовов много и они укладываются в некий
паттерн, этот паттерн выделяется в макрос или функцию высшего порядка.
> А что, foreach(EnumeratorObject EO in Enumerator) — это не дублирование. Давайте избавимся от дублирования! И каждая программа будет занимать по 5 строчек.
В приведенном примере я дублирования не вижу. Приведите пример побольше
— подумаем, как избавиться от дублирования, а пока — маленькое
лирическое отступление.
Абстракция — это присвоение имени некой сложной структуре. Языки
программирования отличаются в наибольшей степени тем, каким объектам
можно дать имя и каким образом можно комбинировать объекты. То, что в
языке Foo дублированием не считается, в языке Bar будет дублированием
просто потому, что Bar позволяет писать на более высоком уровне
абстракции. Вот, по-вашему, в коде ниже нет дублирования?
average (container) = sum(container) / num_elements(container);
Есть! Потому что, например, в языке J можно написать
FDSC wrote: > А что, foreach(EnumeratorObject EO in Enumerator) — это не дублирование.
Кстати, если тело цикла — это просто вызов функции foo, то от
дублирования избавляются так: iter foo enumerator.
Здравствуйте, Programmierer AG, Вы писали:
>> А что, foreach(EnumeratorObject EO in Enumerator) — это не дублирование. Давайте избавимся от дублирования! И каждая программа будет занимать по 5 строчек.
PA>В приведенном примере я дублирования не вижу. Приведите пример побольше PA>- подумаем, как избавиться от дублирования, а пока — маленькое PA>лирическое отступление.
Ты мне скажи, чем for (int i = 0; i < Enumerator; i++)
{
........
}
отличается от foreach(EnumeratorObject EO in Enumerator?
Или, что for, что foreach — всё равно дублирование? Весь код — это дублирование тогда. Применение знака деления — дублирование. Давайте вместо a = c/b и f = d/b сделаем a, f = c, d / b — и устраним дублирование. Кому это надо?
FDSC wrote: > > Ты мне скажи, чем for (int i = 0; i < Enumerator; i++) > { > ........ > } > > отличается от foreach(EnumeratorObject EO in Enumerator? > > Или, что for, что foreach — всё равно дублирование? Весь код — это дублирование тогда. Применение знака деления — дублирование. Давайте вместо a = c/b и f = d/b сделаем a, f = c, d / b — и устраним дублирование. Кому это надо?
for от foreach отличается созданием переменной int i (а может быть long
i? или size_t i? а может быть, переменная i уже используется, а потому j
или k), инициализацией нулем (а может единицей?), проверкой условия i <
container.size() (а может <= ? а может size()-1? а может не size(), а
length() или count()?) и наличием инкремента переменной (постинкремента
или пре-инкремента, это ооочень серьезный вопрос, зайдите в форум C++
. Видите, как много вопросов? Даже если код пишется на автомате, они
отнимают одну зиллионную творческой энергии, которую можно было
потратить лучше. Ну, и являются потенциальным источником ошибок.
Так что foreach в случае, когда нужно пройтись по всему
контейнеру — однозначно upgrade. Хотя, как я уже написал, не предел
совершенству, во многих случаях само объявление переменной для элемента
контейнера (да еще и с типом) — уже дублирование.
Здравствуйте, Mirrorer, Вы писали:
M>Не совсем уловил мысль..
Короче, чем сложнее задача, тем сильнее видна разница между регексами и EBDF.
VD>>мэйнстрим реально регекспы использует не часто. Многие программисты их или вообще не знают, или в них плавают.
M>Есть подозрение граничащее с уверенностью что то же самое будет и с немерловыми макросами,
Макросы в отличии от регексов можно использовать в готовом и отлаженном виде. Так что использовать их будут много и часто, а вот писать... Тут, да. Это скорее всего будет удел продвинутых прграммистов. Ну, оно и хорошо. Это все же мирный атом, а такие технологии лучше держать в квалифицированных и отвественных руках.
M> и с многострадальной лямбдой.
-1
Лямбду будет использоваться во всю. Просто нужно время.
M> Если С++ считать мейнстримом, то я уверен что то же самое можно сказать и про темплейты.
Опять -1. Шаблоны используются на право и на лево. Особенно готовые шаблонные классы. Вот метапрограммирование — это другое дело.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, vvotan, Вы писали:
V>>Здравствуйте, Mirrorer, Вы писали:
M>>>Английский M>>>I am teacher. M>>>Я есть учитель.
V>>На самом деле "I am a teacher", то есть
FDS>"Я есть неопределённый экземпляр класса "учитель" "
>> Если речь идёт про тривиальное for (int i = 0; i < object.Length; i++) — то нет. Это, собственно, не дублирование кода. Не считаете же вы дублированием кода вызов одной и той же функции или применение одного и того же оператора PA>Любой паттерн, в котором изменяется незначительная часть — это дублирование.
Здравствуйте, IT, Вы писали:
IT>select точно скоро будет.
Зачем добавлять ключевые слова в язык, если этой функциональности можно добиться с помощью делегатов?
IT>Да и почему собственно долго? C# от роду чуть больше 4-х лет. Когда выйдет C# 3.0 ему будет 5 лет. Это много для языка?
Добавьте к этому возраст Java и тогда станет видно, что много.
Здравствуйте, Programmierer AG, Вы писали:
PA>trophim wrote: >> З.Ы. Нам в университете както преподаватель сказал: пролог лучше не учите — голову сломаете. PA>Это не преподаватель, это вредитель какой-то. Благодаря таким наше PA>образование катится известно куда. Видел вчера книгу в магазине, явно PA>вот такие отечественные преподаватели писали, — "Основы алгоритмизация и PA>программирования в среде VBA". Вы себе можете представить такого зверя: PA>"алгоритмизация в среде VBA"? Вот получает человек представление о PA>программировании на таком курсе, а рынок — нехватку квалифицированных PA>кадров, РСДН — рассуждения о расстоянии от мэйнстрима до нормальных PA>инструментов и т.д.
О, да, вредитель тот еще. Без шуток. И представляете — зав кафедрой.
А я собственно быстро почуял, что слушать преподов не стоит — себе дороже выйдет, ибо мало кто из них очень хорошо знал предмет. Один только преподаватель меня радовал — по лиспу и смоллтоку. Толковый был мужик.
З.Ы. Усе давно прогнило в королевстве датском... Нет у нас нормального образования в направлении ИТ.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Здравствуйте, trophim, Вы писали:
T>>Да фактически каждый новичок отмечает эту особенность синтаксиса смоллтока.
ANS>Интересно, были ли среди них "новички", знакомящиеся с ST, но еще не знакомых с C/Java/C#?
Гм, ну, мой поток в университете. Не то чтобы не знакомые с другми языками, но разум был еще не затуманен. Так что для нас тогда и смоллток был почти таким же новым, как C++.
А вот таких кто изучал ST, но не знал другого языка, конечно же не было (их бы уже под зад выгнали давно).
Здравствуйте, FDSC, Вы писали:
FDS>Что же это за преимущества, которые не дают экономических преимуществ при разработке ПО?
Где я отрицал возможность получения экономических преимуществ?
<< Под музыку: silent >>
<< При помощи Януса: 1.2.0 alpha rev. 650 >>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: I am a teacher - неопределённый экземпляр класса
Здравствуйте, vvotan, Вы писали:
V>Здравствуйте, FDSC, Вы писали:
FDS>>Здравствуйте, vvotan, Вы писали:
V>>>Здравствуйте, Mirrorer, Вы писали:
M>>>>Английский M>>>>I am teacher. M>>>>Я есть учитель.
V>>>На самом деле "I am a teacher", то есть
FDS>>"Я есть неопределённый экземпляр класса "учитель" "
V>Неопределенный это как? Конструктор не вызван?
Нет, это значит, что он стоит в некоторой коллекции и ничем не выделяется. А вот если бы для него отдельную переменную бы завели, то был бы он "I am the national teacher"
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, FDSC, Вы писали:
FDS>>Что же это за преимущества, которые не дают экономических преимуществ при разработке ПО?
ГВ>Где я отрицал возможность получения экономических преимуществ?
Вы сказали, что не будет волны стартапов, а это значит, что нет экономических преимуществ, так как иначе все им бы пользовались. Собственно, вот логика. Если вас логика не устраивает, объясните почему (вы её уже назвали "наивной", но всё же)
Здравствуйте, Beam, Вы писали:
IT>>select точно скоро будет.
B>Зачем добавлять ключевые слова в язык, если этой функциональности можно добиться с помощью делегатов?
С этим я не буду спорить, хотя просто на делегатах так удобно вряд ли получилось бы.
IT>>Да и почему собственно долго? C# от роду чуть больше 4-х лет. Когда выйдет C# 3.0 ему будет 5 лет. Это много для языка?
B>Добавьте к этому возраст Java и тогда станет видно, что много.
Тогда надо добавлять ещё и возраст C++.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, FDSC, Вы писали:
B>>При любом дублировании кода (даже набор которого длится несколько секунд) вероятность ошибки возрастает.
FDS>Если речь идёт про тривиальное for (int i = 0; i < object.Length; i++) — то нет. Это, собственно, не дублирование кода. Не считаете же вы дублированием кода вызов одной и той же функции или применение одного и того же оператора
Возьмем этот тривиальный код:
for (int i = 0; i < 10; i++) {
... // здесь i не используется
}
Что здесь написано? Присвоить переменной i значение 0. Пока i меньше 10, выполняй тело цикла и увеличивай i на единицу. Вы видите, что в теле не используется переменная i, и понимаете, что это конструкция обозначает повторение 10 раз тела цикла.
Другой код.
timesRepeat(10) {
...
}
Что написано здесь: повторить тело цикла 10 раз
Это и есть повышение уровня абстракции и повышение читабельности.
Где можно ошибиться при наборе timesRepeat(10): в слове timesRepeat (синтаксическая ошибка) или в числе 10 (логическая).
А теперь посмотрите на кучу мест, где можно совершить ошибки в for (да, я прекрасно понимаю, что набивание таких конструкций доведено до автоматизма, но все же).
Этот пример показывает, что даже в таком простом коде имеются предпосылки к удалению дублирования.
В данном случае Вы убрали дублирование кода: удалили введение локальной переменной, присваивание, сравнение, увеличение переменной.
FDS>Возможно я не понял, что именно удобно
Удобно то, что можно не меняя язык вводить такие конструкции как timesRepeat(number) { }
Разве Вы не пользовались бы таким оператором?