powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование
84 сообщений из 84, показаны все 4 страниц
Программирование
    #35374377
StrangerI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите написать курсовую на Turbo Pascal
...
Рейтинг: 0 / 0
Программирование
    #35374747
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 StrangerI
за 2 тыс руб.
--

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Программирование
    #35375069
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полторы

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Программирование
    #35375173
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А про задание нихто и не спросил.

З.Ы. Тыща четырьста пийсят и твоя пояснительная.
...
Рейтинг: 0 / 0
Программирование
    #35375452
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow > полторы
я пас
--

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Программирование
    #35375580
another-anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StrangerIПомогите написать курсовую на Turbo Pascal
Надеюсь, тебя отчислят.
...
Рейтинг: 0 / 0
Программирование
    #35375712
Devider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот объясните мне, убогому, зачем человеков учат турбо паскалю?
...
Рейтинг: 0 / 0
Программирование
    #35375734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю?
Не согласен. Надо спросить - зачем вообще человеков учат кодить?

Предлагаю заставить их изучать бухгалтерский калькулятор "Citizen".
...
Рейтинг: 0 / 0
Программирование
    #35375737
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Green2ScareCrow > полторы
я пас
--

Posted via ActualForum NNTP Server 1.4
прикуп мой
)))))))))))
...
Рейтинг: 0 / 0
Программирование
    #35375744
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю?

Наверное просто показать - что есть программирование (как философии- что есть философия): в диалекты Паскаля проще всего "въезжать" по сравнению с другими языками

И Delphi этим хорош - очень быстро и просто создавать приложения простые и средней сложности.
...
Рейтинг: 0 / 0
Программирование
    #35376090
покермен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добиваю до 1450 :)
...
Рейтинг: 0 / 0
Программирование
    #35376183
Ынтырпрайз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexandrPlus DeviderВот объясните мне, убогому, зачем человеков учат турбо паскалю?

Наверное просто показать - что есть программирование (как философии- что есть философия): в диалекты Паскаля проще всего "въезжать" по сравнению с другими языками

И Delphi этим хорош - очень быстро и просто создавать приложения простые и средней сложности.

Потому что преподы - безумно ленивые люди. И тупые к тому же.

Им вбили в 80-х паскаль, вот они теперь и думают, что п - самый лучший яп в мире.

Во всем мире латынью читается Си и Ява.
...
Рейтинг: 0 / 0
Программирование
    #35376198
Олег_s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++ - имхо лучшее что изобрели на данный момент.
бедные студенты, учат их всякой гадости.
...
Рейтинг: 0 / 0
Программирование
    #35376205
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЫнтырпрайзВо всем мире латынью читается Си и Ява.
Вообще-то в учебниках по дискретной математике алгоритмы принято публиковать в Pascal или Modula.
...
Рейтинг: 0 / 0
Программирование
    #35376851
Ынтырпрайз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton ЫнтырпрайзВо всем мире латынью читается Си и Ява.
Вообще-то в учебниках по дискретной математике алгоритмы принято публиковать в Pascal или Modula.

А учебинки по обработке сигналов все на Си.
А весь нормальный мир ООП выучил по Ява.
А Кнут вообще на асме писал.

И какие учебники? На туалетной бумаге выпущенные такими же ленивыми и тупыми преподами?
Кстати любой вменяемый специалист по дискретной любую это книжонку растопчет - почитайте отзывы.

Короче кури Кристофидеса для понимания идеологии.

И птом ищи библиотеки алгоритмов на .NET, C, C++, Java.
...
Рейтинг: 0 / 0
Программирование
    #35377079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ынтырпрайз
И какие учебники? На туалетной бумаге выпущенные такими же ленивыми и тупыми преподами?
Кстати любой вменяемый специалист по дискретной любую это книжонку растопчет - почитайте отзывы.

Короче кури Кристофидеса для понимания идеологии.

И птом ищи библиотеки алгоритмов на .NET, C, C++, Java.
Ты очень забавный!

Зарегился-б...
...
Рейтинг: 0 / 0
Программирование
    #35378078
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ынтырпрайз А весь нормальный мир ООП выучил по Ява.

За весь мир не скажу - не знаю, а за себя, пожалуй, соглашусь. :)
Хотя применял ( и применяю ) ООП в Delphi, тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Ну, не знаю, может быть, Шилдт и Ноутон так доходчиво пишут или литературу по ООП в Delphi не ту читал. Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java.
...
Рейтинг: 0 / 0
Программирование
    #35378114
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java.
Хм. У меня при изучении Java осталось исключительно изумление по поводу неоправданных ограничений.

edges7Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java.
Хм. Как же она могла полностью утрястись при отсутствии множественного наследования? Это не концепция, это, извиняюсь, фигня.

Кстати, можно пример-другой утрясшихся вопросов, дабы как-то понять?
...
Рейтинг: 0 / 0
Программирование
    #35378170
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Хм. Как же она могла полностью утрястись при отсутствии множественного наследования? Это не концепция, это, извиняюсь, фигня.


Если я не ошибаюсь, то это достаточно спорная технология? Хотя не отрицаю, что иногда ее применение могло бы быть оправданным. Но в руках масс-как бомба, имхо
...
Рейтинг: 0 / 0
Программирование
    #35378196
I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
I
Гость
множественное наследование это зло.

если сильно нужно можно делегированием обойтись.
...
Рейтинг: 0 / 0
Программирование
    #35378205
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloy denЕсли я не ошибаюсь, то это достаточно спорная технология?
Спорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило.
...
Рейтинг: 0 / 0
Программирование
    #35378215
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Хм. У меня при изучении Java осталось исключительно изумление по поводу неоправданных ограничений.

Да, соглашусь. Это не С++.

softwarerХм. Как же она могла полностью утрястись при отсутствии множественного наследования?

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

Что касается отсутствия множественного наследования. Но ведь это характерно для Java, а не для всех языков.

softwarer Это не концепция, это, извиняюсь, фигня.

Вы имеете в виду то, как это реализовано в Java?

softwarer Кстати, можно пример-другой утрясшихся вопросов, дабы как-то понять?

Возвращаемся к каше в голове. :)
...
Рейтинг: 0 / 0
Программирование
    #35378219
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerСпорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило.
Обиделся что downcasts не всегда прокатывают?
...
Рейтинг: 0 / 0
Программирование
    #35378261
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerСпорная или нет - но существенная часть концепции. Поэтому "полностью" концепция уложиться ну никак не может. А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило.

На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой ( по крайней мере в той, в которой я смотрел). Это одна - максимум две главы. В С++, Java это существенная часть. У того же Шилдта это занимает практически четверть книги со всеми выкладками.

softwarer А учитывая, что ООП в Java максимально обрезанное, как нигде более, "полностью" меня зацепило.

Ну что поделаешь, если я решил изучать Java. :)
...
Рейтинг: 0 / 0
Программирование
    #35378276
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7 На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой ...

Хотя и ООП в Delphi - это одна из сильных его сторон.
...
Рейтинг: 0 / 0
Программирование
    #35378286
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Об авторе уже забыли

--

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Программирование
    #35378291
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Да, соглашусь. Это не С++
Я не об этом. Вопрос не в мощи, а в том, что авторы языка действовали без головы (или, вернее, с дурной головой). Скажем, в C++ логика конструирования определяется тем, что объекты могут располагаться в стеке (и инициализироваться мусором), есть множественное наследование и необходимо обеспечить правильную работу деструкторов. В яве - множественного наследования нет, объекты всегда в динамической памяти, инициализируются нулями, а ставшие бессмысленными ограничения тем не менее аккуратно копируются из плюсов.

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

edges7Что касается отсутствия множественного наследования. Но ведь это характерно для Java, а не для всех языков.
Дык я просто к тому, что "изучив ООП по-явовски" даже в дельфе полноценно работать нельзя. Потому как в дельфе оно шире. И поэтому "концепцию полностью" выглядит.. самонадеянно :)

maytonОбиделся что downcasts не всегда прокатывают?
Да нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.
...
Рейтинг: 0 / 0
Программирование
    #35378312
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7На мой взгляд, в литературе по Delphi не особо сильно уделяется внимание концепции ООП, как таковой
На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП. В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке. Смешивание тем из разных доменов - отвратительная привычка, приводящая к каше в голове у обучаемых. Они уже не понимают "откуда растут ноги" у тех или иных тонкостей, они не понимают, что концептуально, что - детали реализации, а что - глупость, которую надо исправлять. Они способны только заучить книгу аки библию и бездумно сыпать цитатами из нее, не умея даже их обосновать - наподобие прозвучавшего здесь "- зло".
...
Рейтинг: 0 / 0
Программирование
    #35378350
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer На мой взгляд, внимание "концепции ООП как таковой" должно уделяться в литературе по ООП.

Да. И замечательно, что такая литература есть. Но на тот момент, к сожалению, про нее просто не знал.

softwarer В литературе по языку нужно говорить об особенностях реализации ООП-механизмов в языке.

Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :)
В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.
...
Рейтинг: 0 / 0
Программирование
    #35378416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerДа нет. "Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.
Я надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию.
...
Рейтинг: 0 / 0
Программирование
    #35378421
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Да, но к примеру, в Delphi я не сразу пришел к ООП. Вернее, не сразу начал с него. Это был постепенный переход. Ну, может быть, это и к лучшему, так как для понимания ООП, его применения пришлось залезть и в литературу по Java. :)
В то же время, книги по С++, Java в своей массе с первых страниц начинают "вдалбливать" ( в хорошем смысле этого слова :) ) концепцию ООП. И в последующем уже читаешь книгу с этой точки зрения. Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.

В C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП.
...
Рейтинг: 0 / 0
Программирование
    #35378472
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ C++/Delphi существует множество лазеек (loopholes) которые позволяют "обойти" ООП стороной. Эти злостные хаки имеют место в литературе и сеют некий хаос в головах обучаемых. Тоесть с одной стороны есть ООП и это хорошо. С другой стороны если плохо - используйте loopholes. Я не могу сказать что это очень плохо. Но в то-же время это не добавляет плюсов ООП.Плохо-плохо. ООП вполне самодостаточен и можно реализовать любой алгоритм не выходя за пределы классов-объектов. А когда мы за них выходим (как это слишком часто происходит в C++ и чуть реже, но бывает в Дельфях) начинается каша поддерживать которую врагу не пожелаешь. Получается тот же самый GOTO, вид сбоку.
...
Рейтинг: 0 / 0
Программирование
    #35378716
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer"Обиделся" я пожалуй что один раз, когда идиотский компилятор ухитрился из-за бредовой реализации инициализации грохнуть мне уже сконструированный объект.

подробнее можно?
...
Рейтинг: 0 / 0
Программирование
    #35378721
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гыподробнее можно?
Примерно следующая ситуация (прошу прощения за возможные синтаксические ошибки, таки не один год как бросил это дело):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 class  A {
   public  A() { ... doSomething(); ... }
   public   void  doSomething() { ... }
}

 class  B  extends  A {
  
   public  B() {  super (); ... }

   private  Vector someList =  null ;

   private   void  registerSomething(Object something) {
     if  (someList ==  null ) someList =  new  Vector();
    someList.add(something);
  }

   public   void  doSomething() {
    ...
    registerSomething(...);
    ...
  }
}

Версию явы не помню, не то 1.3, не то 1.4. Работало это чудо так: делается new B(), в нем super(), вызывается doSomething(), создается someList, завершается A(), и непосредственно перед возвратом в B() выполняется someList = null. Орднунг юбер аллес, Гитлер капут, маразм форева.
...
Рейтинг: 0 / 0
Программирование
    #35378735
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это может сбить с толку. Это нужно знать, что блок инициализации выполняется после конструктора предка. И этому есть обоснование.

Если написать так (а это то же самое) было бы понятнее?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
class B extends A {
  
  public B() { super(); ... }

  private Vector someList;

  {
    someList = null;
  }

  private void registerSomething(Object something) {
    if (someList == null) someList = new Vector();
    someList.add(something);
  }

  public void doSomething() {
    ...
    registerSomething(...);
    ...
  }
}

И потом зачем инициализировать null'ом поле если оно и так null?
...
Рейтинг: 0 / 0
Программирование
    #35378740
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыИ этому есть обоснование
Любопытно было бы услышать. Правда, почти уверен, что оценю иначе.

ГыЕсли написать так (а это то же самое) было бы понятнее?
Понятно оно и так. Просто это концептуальная глупость.

ГыИ потом зачем инициализировать null'ом поле если оно и так null?
После этого и отказался от этой привычки. Хотя инициализировать - аккуратнее.
...
Рейтинг: 0 / 0
Программирование
    #35378837
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПлохо-плохо.

Что русскому хорошо, то немцу плохо
K&R C тоже самодостаточен ... и машина Тьюринга

Зачем ООП ???

Да и не лазейки это. Просто НЕ ООП. Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ?
...
Рейтинг: 0 / 0
Программирование
    #35379021
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Кто собственно сказал, что в C++ должен быть ТОЛЬКО ООП ?
Я-бы такого никогда не сказал. Просто удивляет повсеместное экстраполирование ООП на С++. Хочется, как в монологе Жванецкого подъехать на танке и сказать - ".. а пачему собсно?"
...
Рейтинг: 0 / 0
Программирование
    #35379053
Ынтырпрайз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7 Ынтырпрайз А весь нормальный мир ООП выучил по Ява.

За весь мир не скажу - не знаю, а за себя, пожалуй, соглашусь. :)
Хотя применял ( и применяю ) ООП в Delphi, тем не менее раньше оставались кое-какие вопросы, ответы на которые нашел при изучении Java. Ну, не знаю, может быть, Шилдт и Ноутон так доходчиво пишут или литературу по ООП в Delphi не ту читал. Но тем не менее, сама концепция ООП полностью утряслась в голове только после изучения Java.

Видели бы вы студентов, которые учили ООП по турбопаскалю 5.5 в 2004 году... Ужас...
Особенно когда их пересаживали на делфи....
...
Рейтинг: 0 / 0
Программирование
    #35379242
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ГыИ этому есть обоснование
Любопытно было бы услышать. Правда, почти уверен, что оценю иначе.


Чтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть. Например чтобы проходила такая фишка:

[SRC=java]
class A {

protected List<String> list;

public A() {
list = new ArrayList<String>();
list.add("one");
}

@Override
public String toString() {
return list.toString();
}

publc static void main(String[] argc) {

System.out.println(new A() {
{
list.add("two");
}
});
}

}
[/src]
А пример Ваш надуман, потому что человек, использующий в конструкторе публичный метод, который в любой момент может быть перекрыт, а следовательно потенциально передающий часть ответственности за инициализацию экземпляра предка потомкам, подлежит публичной и позорной экзекуции.
...
Рейтинг: 0 / 0
Программирование
    #35379674
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.
Угу, именно так. Наблюдается подход "каша". Итогом его становится прорва кодеров, кое-как заучивших, но мало что понимающих. Впрочем, объективности ради, по Delphi хороших книг тоже мало, а в большинстве наблюдается ровно такая же каша из языка, IDE и VCL. Вообще, у меня есть впечатление, что немногочисленные хорошие специалисты сейчас получаются не благодаря первым книгам, которые читали, а скорее вопреки им.
...
Рейтинг: 0 / 0
Программирование
    #35379715
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ надеюсь, что это был единичный случай, который не в состоянии изменить взгляды на концепцию.
На какую именно концепцию? На ООП? Мое отношение к ней сформировалось лет за семь до появления Явы. На "ООП в Яве"? Мм... мои взгляды, если коротко, сводятся к точке зрения "авторы этой реализации думали задницей", и этот случай действительно не изменил этих взглядов.
...
Рейтинг: 0 / 0
Программирование
    #35379771
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть.
Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней.

ГыНапример чтобы проходила такая фишка:
Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review.
...
Рейтинг: 0 / 0
Программирование
    #35379841
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ГыЧтобы гарантированность, что в блоке инициализации потомка будет корректно проинициализированная унаследованная часть.
Как я и говорил, фигня это, а не обоснование. "Гарантировать" в данном случае можно и нужно без подобных хреней.

Например?

softwarer
ГыНапример чтобы проходила такая фишка:
Такая фишка спокойно пройдет и при грамотной реализации. Впрочем, сам по себе подобный код не прошел бы у меня code review.

Не пройдет. Если блок инициализации запускался бы перед конструктором предка, то list был бы не проинициализирован.
А почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
...
Рейтинг: 0 / 0
Программирование
    #35380032
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще здесь написано следующее:

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

После этого становится понятно подобное поведение блока инициализации.
...
Рейтинг: 0 / 0
Программирование
    #35380097
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joshua Bloch - Effective Java
There are a few more restrictions that a class must obey to allow inheritance. Constructors
must not invoke overridable methods, directly or indirectly. If this rule is violated, it is
likely that program failure will result. The superclass constructor runs before the subclass
constructor, so the overriding method in the subclass will get invoked before the subclass
constructor has run. If the overriding method depends on any initialization performed by the
subclass constructor, then the method will not behave as expected. To make this concrete,
here's a tiny class that violates this rule:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
public class Super {
// Broken - constructor invokes overridable method
public Super() {
m();
}
public void m() {
}
}
Here's a subclass that overrides m, which is erroneously invoked by Super's sole constructor:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
final class Sub extends Super {
private final Date date; // Blank final, set by constructor
Sub() {
date = new Date();
}
// Overrides Super.m, invoked by the constructor Super()
public void m() {
System.out.println(date);
}
public static void main(String[] args) {
Sub s = new Sub();
s.m();
}
}
You might expect this program to print out the date twice, but it prints out null the first time
because the method m is invoked by the constructor Super() before the constructor Sub() has
a chance to initialize the date field. Note that this program observes a final field in two
different states.
...
Рейтинг: 0 / 0
Программирование
    #35380277
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыНапример?
Путь, который я полагаю наиболее правильным, реализован в C++ и в Delphi, это возможность программисту явно управлять порядком инициализации.

Путь, наиболее подходящий с точки зрения "минимального изменения языка" - доработать концепцию так, чтобы убрать необходимость в уродливой заплате под названием "блок инициализации", ну а инициализирующие присваивания выполнять прежде конструкторов.

Наконец, учитывая интерпретирующий характер языка, в принципе можно инициализировать объекты, обходя дерево зависимостей, и ругаться, если обнаружен цикл. Правда, это имхо извращение, но зато хорошо соответствует идеологии языка.

ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

   class  LsnrOK  extends  ActionListener {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener ( new  LsnrOK()); ... }
}

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

  ActionListener lsnrOK =  new  ActionListener() {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener (lsnrOK); ... }
}

Код: plaintext
1.
2.
3.
 class  A {

  { ... btnOK.addActionListener ( new  ActionListener() {  public   void  actionPerformed .... }); ... }
}

второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством.
...
Рейтинг: 0 / 0
Программирование
    #35380374
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

ГыА почему не пройдет кодревью? У Вас какие-то предубеждения против анонимных классов?
Правильнее будет сказать так: "у меня предубеждение против анонимных объектов анонимных классов". Из вариантов кода

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

   class  LsnrOK  extends  ActionListener {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener ( new  LsnrOK()); ... }
}

Код: plaintext
1.
2.
3.
4.
5.
 class  A {

  ActionListener lsnrOK =  new  ActionListener() {  public   void  actionPerformed .... }

  { ... btnOK.addActionListener (lsnrOK); ... }
}

Код: plaintext
1.
2.
3.
 class  A {

  { ... btnOK.addActionListener ( new  ActionListener() {  public   void  actionPerformed .... }); ... }
}

второй представляется лучшим из возможных в сегодняшних реализациях, первый примерно таким же, но несколько хуже, а третий - полнейшим уродством.

У меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами. Если язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться?
...
Рейтинг: 0 / 0
Программирование
    #35380484
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыУ меня сразу возникает вопрос. Зачем городить лишнее поле или даже класс, если потом он будет использовать только один раз? На мой вкус это только засоряет код ненужными вещами.
Это спасает код от засорения телом анонимных объектов, представляющего собой гораздо большую угрозу читабельности. Подобные "конструируемые на месте" объекты выглядят более-менее нормально в демонстрационных примерах, но когда в реале нужно инициализировать, например, пять кнопок подряд, навесив на каждую по листенеру с двумя-тремя методами, да и тела методов не из одной строки.... Это кошмар.

С практической точки зрения могу назвать эмпирический критерий. Если некоторый программный код выиграет в читабельности от того, что тела подпрограмм будут разбиты пустыми строками - значит, либо этот код плохо написан, либо язык в этом месте имеет неудачный синтаксис.

Вообще, как всегда забавно развитие истории по спирали. Когда-то существовало понятие вложенных, или локальных, подпрограмм. И развитие ООП шло в том числе под лозунгом "наконец-то мы можем уйти от этих жутких, нечитаемых вложенных подпрограмм к простым и ясным последовательно записанным методам объектов". После чего прошло еще несколько лет, и концепцию возродили в виде вложенных объектов, или - в C++ - локальных структур.

ГыЕсли язык предоставляет возможность писать лаконично и чисто, почему ей не воспользоваться?
Во-первых, язык не представляет возможности писать лаконично и чисто. Ява-программы очень громоздки, и даже если в одном конкретном месте можно сэкономить несколько символов, на общем качестве кода это практически не сказывается.

Во-вторых, эта возможность немасштабируема. Ей можно с незначительным выигрышем воспользоваться в маленьком и простом случае, но она приводит к отвратительным последствиям в более сложных. При такой комбинации плюсов и минусов я полагаю правильным не пользоваться ей никогда - целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя".
...
Рейтинг: 0 / 0
Программирование
    #35380572
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть именованный объект анонимного класса - нормально, анонимный объект именованного класса тоже, а вот вместе ни-ни? Похоже на религию.
Просто у меня подход, что если на текущий момент создаваемый экземпляр не нужен нигде более я не постесняюсь применить и анонимный объект и анонимный класс. Если же я вижу, что получившаяся конструкция нечитаема (а на самом деле человеку, который мало работает с явой она просто непривычна), я ничтоже сумняшеся ее вынесу. Решать я это буду в каждом случае индивидуально.
Потом, многие жалуются на засилие кодеманки, а сами же волевым решщением отбирают у человека возможность думать и принимать решение: "целесообразнее ввести это на уровне стандарта кодирования, нежели объяснять каждому "здесь можно, здесь плохо, но еще в принципе терпимо, а вот здесь уже точно нельзя""
...
Рейтинг: 0 / 0
Программирование
    #35380620
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще один аргумент. Создавая объект как поле класса Вы гарантируемо прибиваете его жизненный цикл к жизненному циклу объекта объемлющего класса. То есть он не может быть собран пока существует экземпляр объемлющего класса. В случае анонимного объекта возможны варианты, что добавляет дополнительной гибкости и пространства для маневра сборщику мусора.
...
Рейтинг: 0 / 0
Программирование
    #35380677
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГыТо есть именованный объект анонимного класса - нормально, анонимный объект именованного класса тоже, а вот вместе ни-ни? Похоже на религию.
Звучит сродни "то есть пить водку - нормально, пить пиво - нормально, а вот вместе ни-ни? Похоже на религию".

ГыПросто у меня подход
Я понимаю и не думаю, что стоит пытаться переубедить друг друга. Просто нас это затрагивает вот по какой причине: блоки инициализации - это заплата на комбинацию двух неудачных с моей точки зрения аспектов ява-концепции: "полностью анонимных объектов" и неименованных конструкторов. Соответственно, их потребности с моей точки зрения не являются концептуально важными; напротив, если их потребности приводят к дополнительным проблемам и ограничениям - тем больше причин доработать концепцию и выкинуть эту гадость.

ГыЕсли же я вижу, что получившаяся конструкция нечитаема
Вопрос "читаемости" является вопросом вкусов. С моей точки зрения, эта конструкция иногда "терпима", иногда "очень плоха", но никогда не "оптимальна".

Гы(а на самом деле человеку, который мало работает с явой она просто непривычна),
Ой, да бросьте. Ну что здесь "непривычного", если вспомнить про существующие уже полвека лямбда-функции?

ГыРешать я это буду в каждом случае индивидуально.
Примерно так же Вы можете потребовать права решать в каждом случае индивидуально, использовать ли соглашение об именовании, и какое именно, итп.

У всего есть своя ценность и своя цена. В том числе у унификации кода, и особенно - у унификации кода при работе в команде. Я не согласен с теми, кто полагает ценность унификации очень большой, и говорит "пусть плохо, зато по одному образцу". Я точно так же не согласен с предложением считать ее нулевой (всегда и везде решать индивидуально). Я полагаю так: там, где различия не создают значимой ценности, предпочтительна унификация; там, где унифицированный подход в некоторых случаях конкретно плох, следует решать индивидуально.
...
Рейтинг: 0 / 0
Программирование
    #35380863
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Радикализм это признак ограниченности. В гипертрофированном случае он выливается в нередкие здесь холиворы о синтаксисе (C vs Pascal) и прочее. Есть задача и есть инструмент.
Любая проблема имеет решение или workaround. (Те же неименованные конструкторы через статические порождающие методы) Если Вы используете инструмент извольте изучить его и применять правильно. Не нравится - берите другой.
...
Рейтинг: 0 / 0
Программирование
    #35380886
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И больше всего раздражают люди приходящие со своим уставом в чужой монастырь. То есть зная один язык пытаются писать в том же стиле на другом, не соизволив в должной мере его изучить. А потом приходят в форумы и говорят: "Что-то там у них все через задницу".
...
Рейтинг: 0 / 0
Программирование
    #35381515
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 softwarer:

softwarer
Когда-то существовало понятие вложенных, или локальных, подпрограмм.

Локальные процедуры/функции и сейчас есть -- в Delphi. И это удобно.

softwarer
После чего прошло еще несколько лет, и концепцию возродили в виде вложенных объектов, или - в C++ - локальных структур.

В C++ это в ограниченном виде. Методы локальной структуры не могут по-простому использовать локальные переменные охватывающей функции, то есть тяжело дотянуться до контекста. Также, локальная структура не может быть параметром шаблона -- это важно для STL.
...
Рейтинг: 0 / 0
Программирование
    #35381612
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно.


А замыкания есть в Delphi ? Или на любой Чих будет AV ?
Удобно ? вряд ли.

Не так сложно реализовать вложенные функции в C++ как бороться с последствиями такой реализации
...
Рейтинг: 0 / 0
Программирование
    #35381707
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer edges7Т.е. в данном случае параллельно изучаются и сам язык и применение ООП и в какой степени конструирование программ в стиле ООП. Т.е. наблюдается несколько другой подход.
Угу, именно так. Наблюдается подход "каша". Итогом его становится прорва кодеров, кое-как заучивших, но мало что понимающих. ...

Думается, что это несколько спорное утверждение. Многое зависит от способа восприятия информации. Можно читать и слепо верить в прочитанное, а можно читать, размышляя над уже прочитанным. Скажем, если некий товарищ, решая задачу, обратился к источнику, в котором его проблема описана, взял и тупо скопировал оттуда код в свое приложение - то это одно. А если прочитав, подумал, доработал решение ( т.е. ухватил идею и развил ее ), ну или хотя бы задумался над прочитанным - то это уже совсем другое. Вообщем, это я все к тому, что думать еще никто не отменял.

softwarer Вообще, у меня есть впечатление, что немногочисленные хорошие специалисты сейчас получаются не благодаря первым книгам, которые читали, а скорее вопреки им.

Ну да, по началу трудно соориентироваться в море литературы и на первый взгляд отделить хорошее от плохого, если разве только какой-нибудь гуру не подскажет в каком направлении двигаться. Но со временем это перестает быть проблемой.
...
Рейтинг: 0 / 0
Программирование
    #35382577
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gluk (Kazan):

Gluk (Kazan)
Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно.
А замыкания есть в Delphi ?

Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью).

Gluk (Kazan)
Или на любой Чих будет AV ?

Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени).

Если локальная процедура/функция избегает указателей, то я не вижу как можно получить access violation. А если процедура/функция работает с указателями, то тут уж не важно, локальная она или нет, риск access violation присутствует, это неизбежная плата за указатели.

То есть в Delphi локальные процедуры/функции не повышают риск access violation.

Gluk (Kazan)
Удобно ? вряд ли.

Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код.

Gluk (Kazan)
Не так сложно реализовать вложенные функции в C++ как бороться с последствиями такой реализации

Из-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию. А там, где появился указатель, действительно и до access violation недалеко (хотя в данном случае маловероятно).
...
Рейтинг: 0 / 0
Программирование
    #35382649
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов2 Gluk (Kazan):

Gluk (Kazan)
Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно.
А замыкания есть в Delphi ?

Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью).


О как o O. А Perl давно функциональным стал ???

Пётр Седов
Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени).


Ну и толку тогда от них ? Синдром шоколадного чайника ???

Пётр Седов
Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код.


Локальные функторы - это ТОЖЕ удобно :)
...
Рейтинг: 0 / 0
Программирование
    #35382877
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы
Слушай, вот объясни пожалуйста, что ты хочешь кроме "выплеснуть раздражение". Я сказал: объектная модель Явы максимально обрезанная, а реализация плоха. Это правда. Ты мог бы оспорить, мог бы расписать список фич и начинать ставить галочки - здесь есть, здесь нет - но не стал этого делать. Вместо этого ты зацепился за одно замечание, причем скорее всего с мыслью "а вот сейчас вытащим на конкретику и раскатаем". Оказалось - действительно факт. Далее у тебя пошли такие странные посты... такое впечатление, что в тебе борятся глухое бессмысленное раздражение и желание таки быть объективным.

Так или иначе, на всю конкретику я ответил. Когда сказал "можно лучше" - рассказал как. Итп. Напротив, ты, начиная речи, регулярно попадаешь пальцем в небо - сначала про обоснования, потом про "непривычность". Я пользовался этим инструментом, я знаю его достаточно, чтобы не садиться в лужу, и я считаю его плохим. Вот теперь объясни: чего ты от меня хочешь? Чтобы я им не пользовался? Я именно так и делаю: пощупал на одном проекте и не собираюсь возвращаться. Чтобы я славил его замечательность? Извини, врать очень не люблю. Чтобы я молчал в тряпочку? За этим иди на форум явы. Клянусь, я туда не захожу, и похода "приду и расскажу вам всем, как вам плохо" не планирую. А здесь у нас форум "программирование", со всеми вытекающими.
...
Рейтинг: 0 / 0
Программирование
    #35382895
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gluk (Kazan):

Gluk (Kazan)
Пётр Седов
Gluk (Kazan)
Пётр СедовЛокальные процедуры/функции и сейчас есть -- в Delphi. И это удобно.
А замыкания есть в Delphi ?

Нет, ведь Delphi -- язык не функциональный (а императивный), к тому же с ручным управлением памятью (а удобные замыкания можно сделать только в языке с автоматическим управлением памятью).

О как o O. А Perl давно функциональным стал ???

Из моих слов не следует, что Perl -- функциональный язык. Но функциональный стиль ему не чужд. В Wikipedia в статье про Perl написано:
Wikipedia
Perl
...
Overview
...
Its major features include support for multiple programming paradigms (procedural, object-oriented, and functional styles), ...

В отличие от Delphi, в Perl-е автоматическое управление памятью, поэтому язык может предоставить удобные замыкания.

Gluk (Kazan)
Пётр Седов
Delphi запрещает брать адрес локальных процедур/функций. Поэтому их нельзя вызвать динамически (по указателю), можно только статически (по имени).

Ну и толку тогда от них ? Синдром шоколадного чайника ???

Толк от локальных процедур/функций такой же, как от раскладывания файлов или писем по папкам -- структуризация. Она важна, когда этих процедур/функций/файлов/писем становится много.

И ещё локальные процедуры/функции избавляют от возни с указателями на контекст.

Gluk (Kazan)
Пётр Седов
Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код.

Локальные функторы - это ТОЖЕ удобно :)

C++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции).

К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону).
...
Рейтинг: 0 / 0
Программирование
    #35382933
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7Думается, что это несколько спорное утверждение. Многое зависит от способа восприятия информации.
Само собой. Я здесь говорю в "статистическом" смысле. Понятно, что действительно талантливый человек достигнет многого при самом дерьмовом обучении. Вопрос в том, что получится из "толпы прочитавших". Я придерживаюсь той точки зрения, что "урок математики", "урок русского языка" и "урок физкультуры" дадут среднему ученику больше, нежели "три урока каши из первого, второго и третьего".
...
Рейтинг: 0 / 0
Программирование
    #35383101
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовНет, ведь Delphi -- язык не функциональный (а императивный)
...
Из моих слов не следует, что Perl -- функциональный язык.


Странно :) Ну не следует так не следует :)

Пётр Седов
Но функциональный стиль ему не чужд.


С++ тоже ... не чужд (в отличии от Delphi)

Пётр Седов
К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону).

А в Delphi можно ?
...
Рейтинг: 0 / 0
Программирование
    #35383259
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Гы
Слушай, вот объясни пожалуйста, что ты хочешь кроме "выплеснуть раздражение". Я сказал: объектная модель Явы максимально обрезанная, а реализация плоха. Это правда. Ты мог бы оспорить, мог бы расписать список фич и начинать ставить галочки - здесь есть, здесь нет - но не стал этого делать. Вместо этого ты зацепился за одно замечание, причем скорее всего с мыслью "а вот сейчас вытащим на конкретику и раскатаем". Оказалось - действительно факт. Далее у тебя пошли такие странные посты... такое впечатление, что в тебе борятся глухое бессмысленное раздражение и желание таки быть объективным.

Так или иначе, на всю конкретику я ответил. Когда сказал "можно лучше" - рассказал как. Итп. Напротив, ты, начиная речи, регулярно попадаешь пальцем в небо - сначала про обоснования, потом про "непривычность". Я пользовался этим инструментом, я знаю его достаточно, чтобы не садиться в лужу, и я считаю его плохим. Вот теперь объясни: чего ты от меня хочешь? Чтобы я им не пользовался? Я именно так и делаю: пощупал на одном проекте и не собираюсь возвращаться. Чтобы я славил его замечательность? Извини, врать очень не люблю. Чтобы я молчал в тряпочку? За этим иди на форум явы. Клянусь, я туда не захожу, и похода "приду и расскажу вам всем, как вам плохо" не планирую. А здесь у нас форум "программирование", со всеми вытекающими.

Мое раздражение ни в коей мере не относилось к тебе. Это к тем личностям, которые подобным образом поступают. Если отнес на свой счет, зря. Ты как раз последователен и аргументацией не брезгуешь.

А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс?

Кстати про блок инициализации, я приводил цитату, что он всего лишь тупо вкопируется в начало каждого конструктора. Осознание этого простого факта ставит все на свои места.
...
Рейтинг: 0 / 0
Программирование
    #35383264
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gluk (Kazan):

Gluk (Kazan)
Пётр СедовНет, ведь Delphi -- язык не функциональный (а императивный)
...
Из моих слов не следует, что Perl -- функциональный язык.

Странно :) Ну не следует так не следует :)

А что странного? Я утверждаю:
Delphi -- не функциональный язык.
Delphi -- императивный язык.
Разве из этих утверждений следует, что Perl -- функциональный язык?
Создатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью.

Gluk (Kazan)
Пётр Седов
Но функциональный стиль ему не чужд.

С++ тоже ... не чужд (в отличии от Delphi)

На C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа.

В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать.

Gluk (Kazan)
Пётр Седов
К тому же, C++-ный локальный функтор нельзя скормить STL-алгоритму (и вообще, любому шаблону).

А в Delphi можно ?

Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он.
...
Рейтинг: 0 / 0
Программирование
    #35383390
edges7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гы А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс?

softwarer

Мне кажется, что этот спор будет бесполезным, так как есть подозрения, что каждый из вас при любом его исходе все равно останется при своем мнении.

P.S. "Программируйте с использованием языка, а не на языке" (с) Стив Макконнелл. Совершенный код. Глава 34.4
...
Рейтинг: 0 / 0
Программирование
    #35383412
Гы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edges7 Гы А давай на самом деле в конкретику. Список фич это здорово (например Dephi OOP vs Java OOP, как я понял Delphi тебе ближе), только что возьмем за референс?

softwarer

Мне кажется, что этот спор будет бесполезным, так как есть подозрения, что каждый из вас при любом его исходе все равно останется при своем мнении.

P.S. "Программируйте с использованием языка, а не на языке" (с) Стив Макконнелл. Совершенный код. Глава 34.4

Возможно. Но в споре рождается истина. Главное оперировать фактами и не скатываться на личности.
...
Рейтинг: 0 / 0
Программирование
    #35383424
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью.


Давайте заканчивать этот цырк
замыкания имеют весьма опосредованное отношение к "функциональному" стилю

К управлению памятью разумеется имеют самое прямое

Пётр Седов
Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он


человек не должен критиковать другого человека на той почве, на которой он сам не стоит перпендикулярно

В Delphi и таких то нет :)
в каой STL ты будешь передавать свои локальные функции ?
...
Рейтинг: 0 / 0
Программирование
    #35383435
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа.


да вы шо ? o O

Пётр Седов
В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать.


Правда ? А вот в D собираются (хотя там аналогичная проблема)
дело очевидно не в "ручном" управлении памятью
...
Рейтинг: 0 / 0
Программирование
    #35384347
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gluk (Kazan):

Gluk (Kazan)
Пётр СедовСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий. Да и не сделать удобные замыкания в языке с ручным управлением памятью.

Давайте заканчивать этот цырк

Я и не начинал никакого цирка. Вы спросили:
Gluk (Kazan)
А замыкания есть в Delphi ?

Я ответил, что нет, и попытался обосновать, почему нет.

Gluk (Kazan)
замыкания имеют весьма опосредованное отношение к "функциональному" стилю

Замыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля.

Gluk (Kazan)
Пётр Седов
Это не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он

человек не должен критиковать другого человека на той почве, на которой он сам не стоит перпендикулярно

Если я считаю, что C++-ные локальные функторы -- неудобные и ограниченные, то, думаю, я имею право это высказать. И Delphi здесь совершенно ни при чём.

Gluk (Kazan)
В Delphi и таких то нет :)

Действительно, в Delphi нет локальных функторов, аналогичных C++-ным. Никто и не утверждал, что есть.

Gluk (Kazan)
в каой STL ты будешь передавать свои локальные функции ?

Delphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова.

Gluk (Kazan)
Пётр СедовНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа.

да вы шо ? o O

Там есть замыкания или лямбда-функции? По-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит.

Gluk (Kazan)
Пётр Седов
В C++ так же ручное управление памятью, поэтому удобных замыканий тоже не сделать.

Правда ?

Я слышал про планы добавить в C++0x (будущий стандарт C++) необязательную сборку мусора. Тогда удобные замыкания можно будет сделать, но это очень туманная перспектива.

Gluk (Kazan)
А вот в D собираются (хотя там аналогичная проблема)

В D нет аналогичной проблемы -- там автоматическое управление памятью (точнее, смешанное), в отличие от C++.

Gluk (Kazan)
дело очевидно не в "ручном" управлении памятью

Нет, чтобы реализовать удобные замыкания, требуется именно автоматическое управление памятью. Вы же сами написали:
Gluk (Kazan)
замыкания имеют весьма опосредованное отношение к "функциональному" стилю
К управлению памятью разумеется имеют самое прямое
...
Рейтинг: 0 / 0
Программирование
    #35384721
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Пётр Седов

Вы знаете, я бы в общем то не возражал, НО из Вас как из Рога Изобилия по любому поводу просто сыпятся мыстли, с которыми я мягко говоря не согласен (это была преамбула)

1. Вы похвалились наличием в Delphi "удобных" локальных функций (которых нет в C++)
2. Поскольку (с моей точки зрения) пользы от локальных функций не реализующих замыкания немного, я переспросил (разумеется зная ответ) как там у вас с замыканиями
3. На что было отвечено, что замыканий нет, поскольку Delphi не ФЯ (термин "ручное" управление несколько коробит (автоматических сторожей в C++ никто не отменял), но бох с ним
4. Я несколько по другому понимаю слово "неотъемлемая". Для меня оно означает не то что фича появилась в каком то месте, а скорее то, что место это без фичи просто не может существовать. Посему был приведен в пример Perl, ни разу не функциональный (об этом ниже), но реализующий вполне себе полноценные замыкания. Не удержусь от цитирования ображчика ущербной логики:

авторЗамыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля.

5. К слову сказать, даже в SICP макимальное внимание к замыканиям уделяется в разделах, посвещенных императивному программированию
6. Далее Вами было заявлено, что и Perl имеет отношение к ФП :) Конечно имеет, но C++ в таком случае, к ФП имеет еще большее отношение, поскольку из трех категорий языков

а) Языки поощеряющие ФП, но пригодные для ИП (Lisp)
б) Языки императивные на которых можно использовать ФП (Perl)
в) Языки на которых кроме как ФП больше никак писать нельзя (шаблоны C++, XSLT)

к ФЯ я все-таки отнесу последние
7. Вами было заявлено, что ФП на C++ неудобно, громоздко и без boost-а чуть ли не невозможно (во всяком случае так я Вас понял), на что Вам было предоставлено аргументированное ни разу не бустовое, не тривиальное и вполне быстро компилирующееся применение метапрограммирования на C++, совершенно однозначно имеющее отношение к ФП (в отличии от замыканий являющихся хоть и удобным но всего-лишь бантиком). Сложное ? на мой взгляд нет. Просто несколько непривычное и требующее определенных навыков. Громоздкое ? сравним:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template <class T, class G, class R> struct EClos;
template <class G, class R> struct EClos<NullType,G,R> {typedef R Result;};
template <int N, class T, class G, class R> struct EClos<Set<N,T>,G,R>
{ private:
    typedef typename Move<N,G,NullType>::Result L;
    typedef typename Filter<L,typename Append<T,R>::Result,NullType,NotExist>::Result F;
  public:
    typedef typename EClos<typename Append<T,F>::Result,G,
                           typename Set<N,R>
                          >::Result Result;
};

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
(define (eclos nodes graph)
  (define (addzero r s)
    (cond ((null? s) r)
          ((=  0  (car s)) (addzero (cons (car s) r)))
          (else (addzero r (cdr s))))
  )
  (define (clos r node graph)
    (cond ((null? graph) r)
          ((and (eq? node (caar graph))
                (null? (cddar graph))) (clos (cons (cadar graph) r) node (cdr graph)))
          (else (clos r node (cdr graph))))
  )
  (define (step r s)
    (cond ((null? s) r)
          (else (let ((cl (clos '() (car s) graph)))
                  (step (addzero (cons (car s) r) cl)
                        (append (cdr s) (filter cl (append r s)))))))
  )
  (step '() nodes)
)

очевидно, что нет :)
8. Мной были упомянуты функторы как альтернатива локальным функциям и замыканиям (захват всего необходимого можно выполнять ручками в конструкторе). Разумеется, локальные функторы нельзя передавать в шаблоны :) но вложенные еще как можно ;) А если считать функтор аналогом функции, то аналогом локальной функции можно считать функтор вложенный в другой функтор чем это неудобнее вплане структурирования кода я не постигаю ибо сам для этого постоянно ими пользуюсь. Разьве что тем, что функторы предоставляют куда большую функциональность (особенно если делать их шаблонами) ? Кстати, возможно я не до конца оценил глубину Вашей мысли:

авторИз-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию.

образчик кода на Delphi Вас не затруднит?
В общем, пока что Вы не убедили меня что:

авторC++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции).

на мой взгляд, они куда более удобны и функциональны
9. Вот это мне нравится:

авторСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий.

С точки зрения логики, все вроде впорядке :) Зато можно подумать, что замыкания неотъемлимая часть ФП
И что не может быть ФП без замыканий (напоминает анекдот про бегимота, прилипшего к хвостику белочки)

авторНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа.

IMHO надо добавлять. Ваше незнание или неумение не повод рожать (или поддерживать) нездоровые сенсации. В том коде что я привел есть boost ? 10-этажные шаблоны ??? Или он компилировался у Вас 2 часа ? Либо у Вас очччченннь медддленная машинка, либо Вы клеветник, батенька

авторЭто не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он.

Примеры ограниченности, пожалуйста (желательно с C++ кодом) Только не локальных а вложенных

авторDelphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова.

А функторы можно И кто из них после этого ограниченный ???

авторТам есть замыкания или лямбда-функции?

Вам нужны лямбды ? Их есть у нас:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
template <class H, class T>
struct Cons
{ template <template <class,class> class M>
  struct L
  { typedef typename M<H,T>::R R;
  };
};

template <class P>
struct Car
{ template <class H, class T>
  struct L
  { typedef H R;
  };
  typedef typename P::L<L>::R R;
};

template <class P>
struct Cdr
{ template <class H, class T>
  struct L
  { typedef T R;
  };
  typedef typename P::L<L>::R R;
};

авторПо-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит.

Неудобно, но единственно возможно.
Кстати, Вы действительно думаете, что я написал все это без отладки ?
Вы мне определенно льстите :)
...
Рейтинг: 0 / 0
Программирование
    #35386361
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gluk (Kazan):

Gluk (Kazan)
1. Вы похвалились наличием в Delphi "удобных" локальных функций (которых нет в C++)

Я не похвалился, а заметил, что это удобно.

Gluk (Kazan)
2. Поскольку (с моей точки зрения) пользы от локальных функций не реализующих замыкания немного,

Польза от Delphi-йских локальных процедур/функций -- лёгкий доступ к контексту и лучшая структуризация кода. Если бы локальные функции были в C++, то пришлось бы меньше перекомпилировать: изменение внутренностей функции, написанной в .cpp-файле, не затрагивает заголовочный файл.

Gluk (Kazan)
я переспросил (разумеется зная ответ) как там у вас с замыканиями

Обычно, когда твёрдо знают ответ, вопрос не задают (Вы не преподаватель на экзамене и не часовой, спрашивающий пароль). К тому же, вопросов было два:
Gluk (Kazan)
А замыкания есть в Delphi ? Или на любой Чих будет AV ?

Второй вопрос заставляет усомниться, что Вы твёрдо знали ответ на первый.
Кстати, «у вас» -- это у кого?

Gluk (Kazan)
термин "ручное" управление несколько коробит (автоматических сторожей в C++ никто не отменял),

По моим понятиям, в C++ ручное управление памятью. Хотя его можно «полуавтоматизировать» с помощью разных ухищрений (например, умные указатели).

Gluk (Kazan)
4. Я несколько по другому понимаю слово "неотъемлемая".

Я в этом обсуждении не использовал слово «неотъемлемый» или его формы.

Gluk (Kazan)
Для меня оно означает не то что фича появилась в каком то месте, а скорее то, что место это без фичи просто не может существовать. Посему был приведен в пример Perl, ни разу не функциональный (об этом ниже), но реализующий вполне себе полноценные замыкания. Не удержусь от цитирования ображчика ущербной логики:

авторЗамыкания появились именно в функциональных языках, для которых функциональный стиль -- основной (или единственно возможный). Так что замыкания -- это черта функционального стиля.

5. К слову сказать, даже в SICP макимальное внимание к замыканиям уделяется в разделах, посвещенных императивному программированию

Что является функциональным языком/программированием/стилем, а что не является -- это вопрос глубоко философский, мне его не интересно обсуждать. Мне интересно обсуждать, что на грешной земле делается -- C++-ные локальные функторы и Delphi-йские локальные процедуры/функции.

Gluk (Kazan)
6. Далее Вами было заявлено, что и Perl имеет отношение к ФП :) Конечно имеет, но C++ в таком случае, к ФП имеет еще большее отношение, поскольку из трех категорий языков

а) Языки поощеряющие ФП, но пригодные для ИП (Lisp)
б) Языки императивные на которых можно использовать ФП (Perl)
в) Языки на которых кроме как ФП больше никак писать нельзя (шаблоны C++, XSLT)

к ФЯ я все-таки отнесу последние

C++-шаблоны можно использовать как функциональный язык для мета-программирования, но у этого около-языка куча минусов:
* Большинство C++-программистов им не владеет.
* Невозможно пройтись по коду в отладчике.
* Не поддерживаются floating point числа.
* Очень неудобно указывать строковые литералы (и вообще работать со строками).

Gluk (Kazan)
7. Вами было заявлено, что ФП на C++ неудобно, громоздко и без boost-а чуть ли не невозможно (во всяком случае так я Вас понял),

Да, Вы правильно меня поняли. Для написания мета-программы в функциональном стиле, выполняющейся в compile-time, Boost не обязателен, C++-шаблонов достаточно. Boost нужен ради Boost.Lambda для написания программы в функциональном стиле, выполняющейся в run-time.

Gluk (Kazan)
на что Вам было предоставлено аргументированное ни разу не бустовое, не тривиальное и вполне быстро компилирующееся применение метапрограммирования на C++, совершенно однозначно имеющее отношение к ФП (в отличии от замыканий являющихся хоть и удобным но всего-лишь бантиком). Сложное ? на мой взгляд нет.

Да, сложное. В том смысле, что для большинства C++-программистов это тайнопись. Но главное: я имел в виду функциональный стиль в программах, выполняющихся в run-time, а не в compile-time.

Gluk (Kazan)
Просто несколько непривычное и требующее определенных навыков. Громоздкое ? сравним:
код на C++-шаблонах
код на Lisp-е
очевидно, что нет :)

Напишите на C++ в функциональном стиле преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в run-time. Вот тут и проявится различие между C++ и функциональными языками. В отличие от мета-кода на C++-шаблонах, код на Lisp-е можно выполнить в run-time.

Gluk (Kazan)
8. Мной были упомянуты функторы как альтернатива локальным функциям и замыканиям (захват всего необходимого можно выполнять ручками в конструкторе).

Вот именно это и неудобно. С Delphi-йскими локальными процедурами/функциями не надо ничего захватывать вручную, всё просто и удобно.

Gluk (Kazan)
Разумеется, локальные функторы нельзя передавать в шаблоны :)

Именно о локальных функторах и идёт речь. И ещё о Delphi-йских локальных процедурах/функциях. То есть речь идёт о том, что определено локально (в рамках функции).

Gluk (Kazan)
но вложенные еще как можно ;)

О них речь не идёт.

Gluk (Kazan)
А если считать функтор аналогом функции, то аналогом локальной функции можно считать функтор вложенный в другой функтор чем это неудобнее вплане структурирования кода я не постигаю ибо сам для этого постоянно ими пользуюсь.

Теряется локальность, нелокальный функтор надо писать вне функции. Скорее всего, нелокальный функтор надо упомянуть в заголовочном файле, это может привести к избыточной перекомпиляции в случае изменений.

И ещё та же проблема, что и с локальными функторами: тяжело дотянуться до контекста.

Gluk (Kazan)
Кстати, возможно я не до конца оценил глубину Вашей мысли:
авторИз-за отсутствия в C++ нормальных локальных функций (которым легко доступен контекст, например локальная переменная охватывающей функции), их приходится эмулировать, передавая указатель на контекст в обычную (нелокальную) функцию.
образчик кода на Delphi Вас не затруднит?

Код на C++ и Delphi -- см. ниже.

Gluk (Kazan)
В общем, пока что Вы не убедили меня что:
авторC++-ные локальные функторы -- менее удобная вещь, чем Delphi-йские локальные процедуры/функции, из которых легко использовать контекст (например, локальную переменную охватывающей процедуры/функции).
на мой взгляд, они куда более удобны и функциональны

В C++-ном локальном функторе тяжело дотянуться до контекста, это неудобно. В Delphi-йской локальной процедуре/функции легко дотянуться до контекста, это удобно.

Gluk (Kazan)
9. Вот это мне нравится:

авторСоздатели Delphi не стремились обеспечить поддержку функционального стиля, поэтому в Delphi и нет замыканий.

С точки зрения логики, все вроде впорядке :) Зато можно подумать, что замыкания неотъемлимая часть ФП
И что не может быть ФП без замыканий (напоминает анекдот про бегимота, прилипшего к хвостику белочки)

Опять же, меня не интересует, в чём заключается глубинная истинная сущность функционального языка/программирования/стиля.

Gluk (Kazan)
авторНа C++ писать в функциональном стиле очень неудобно. Требуются 10-этажные шаблоны вроде Boost.Lambda. И компилируется это 2 часа.
IMHO надо добавлять.

Как ни странно, то, что я пишу, -- это моё личное мнение ( m y o pinion), за исключением цитат, выделенных особо.

Gluk (Kazan)
Ваше незнание или неумение не повод рожать (или поддерживать) нездоровые сенсации.

Нет никакой сенсации в том, что C++ плохо подходит для написания программ в функциональном стиле, выполняющихся в compile-time или run-time. Для этого другие языки есть.

Gluk (Kazan)
В том коде что я привел есть boost ?

В Вашем коде (преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в compile-time) не используется Boost.

Gluk (Kazan)
10-этажные шаблоны ???

Нагромождение шаблонов есть.

Gluk (Kazan)
Или он компилировался у Вас 2 часа ?

Я не компилировал Ваш код.
Игрушечные примеры мета-программирования на C++-шаблонах (например, вычисление факториала) компилируются быстро. Но если делать что-то серьёзное, то компилируется долго.

Попробуйте сделать parser C++ с помощью Boost.Spirit. Уверен, компилироваться будет долго. Слышал, что люди отказываются от Boost.Python именно из-за времени компиляции.

Gluk (Kazan)
авторЭто не к «C++-ный локальный функтор vs. Delphi-йская локальная процедура/функция», а просто к неудобству C++-ного локального функтора, безотносительно к другим языкам. Слишком ограниченный он.
Примеры ограниченности, пожалуйста (желательно с C++ кодом)

1. Локальный функтор не может по-простому использовать контекст, например, локальную переменную охватывающей функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
void Func()
{
  int Counter =  0 ; // контекст

  struct LocalFunctor1
  {
    int operator()(int n) const
    {
      Counter++; // ошибка компиляции
      return n * n;
    }
  };
  LocalFunctor1 f1;
  int a = f1( 3 );
  assert(a ==  9 );

  struct LocalFunctor2
  {
    int operator()(int n) const
    {
      Counter++; // ошибка компиляции
      return  2  * n;
    }
  };
  LocalFunctor2 f2;
  int b = f2( 3 );
  assert(b ==  6 );

  assert(Counter ==  2 );
}
Доступ к контексту придётся делать через указатель (или ссылку):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
void Func2()
{
  int Counter =  0 ; // контекст

  struct LocalFunctor1
  {
    int* pCounter;
    int operator()(int n) const
    {
      (*pCounter)++;
      return n * n;
    }
  };
  LocalFunctor1 f1;
  f1.pCounter = &Counter;
  int a = f1( 3 );
  assert(a ==  9 );

  struct LocalFunctor2
  {
    int* pCounter;
    int operator()(int n) const
    {
      (*pCounter)++;
      return  2  * n;
    }
  };
  LocalFunctor2 f2;
  f2.pCounter = &Counter;
  int b = f2( 3 );
  assert(b ==  6 );

  assert(Counter ==  2 );
}
Это неудобно (особенно, если контекста много). В Delphi таких проблем нет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 procedure  Proc;
 var 
  Counter: Integer;  // контекст 
  a, b: Integer;

   function  LocalFunction1(n: Integer): Integer;
   begin 
    Inc(Counter);
    result := n * n;
   end ;

   function  LocalFunction2(n: Integer): Integer;
   begin 
    Inc(Counter);
    result :=  2  * n;
   end ;

 begin 
  Counter :=  0 ;

  a := LocalFunction1( 3 );
  Assert(a =  9 );

  b := LocalFunction2( 3 );
  Assert(b =  6 );

  Assert(Counter =  2 );
 end ;

2. Тип локального функтора не может быть параметром шаблона (по крайней мере, в нынешнем C++), поэтому локальный функтор нельзя использовать, например, в качестве предиката для STL-алгоритма:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// ItemList.h

#include <vector>

class ItemList
{
public:
  void SortByField1();
  void SortByField2();
private:
  struct Item // деталь реализации, должна быть в private-секции
  {
    int Field1;
    int Field2;
  };
  std::vector<Item> m_Items;
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// ItemList.cpp

#include "ItemList.h"
#include <algorithm>

using namespace std;

void ItemList::SortByField1()
{
  struct Field1Less // локальный функтор
  {
    bool operator()(const Item& a, const Item& b) const
    {
      return a.Field1 < b.Field1;
    }
  };
  sort(m_Items.begin(), m_Items.end(), Field1Less()); // ошибка компиляции
}

// для Field2 то же самое
...
Выход -- сделать функторы нелокальными:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
// ItemList2.h

#include <vector>

class ItemList2
{
public:
  void SortByField1();
  void SortByField2();
private:
  struct Item // деталь реализации, должна быть в private-секции
  {
    int Field1;
    int Field2;
  };
  struct Field1Less; // упоминание функтора
  struct Field2Less; // упоминание функтора
  std::vector<Item> m_Items;
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// ItemList2.cpp

#include "ItemList2.h"
#include <algorithm>

using namespace std;

struct ItemList2::Field1Less
{
  bool operator()(const Item& a, const Item& b) const
  {
    return a.Field1 < b.Field1;
  }
};

void ItemList2::SortByField1()
{
  sort(m_Items.begin(), m_Items.end(), Field1Less());
}

// для Field2 то же самое
...
Но теряется локальность, и функторы надо упомянуть в заголовочном файле. Если захочется перейти от std::sort к собственному алгоритму сортировки (это разумно, если ключ -- целое число из небольшого диапазона), то придётся изменить содержимое заголовочного файла. Это вызовет избыточную перекомпиляцию.

Gluk (Kazan)
Только не локальных а вложенных

Не подменяйте тему, речь идёт именно о локальных функторах (то есть определённых в рамках функции):
Gluk (Kazan)
Пётр Седов
Локальные процедуры/функции -- это действительно удобно, и в VCL они широко используются, чтобы структурировать код.

Локальные функторы - это ТОЖЕ удобно :)

Хочется именно локальности, чтобы писать код «не отходя от кассы». И чтобы при изменениях перекомпилировать поменьше.

Gluk (Kazan)
авторDelphi-йские локальные процедуры/функции не предназначены для того, чтобы их куда-то передавать (это запрещено). Они предназначены для непосредственного вызова.
А функторы можно

Локальные функторы не передать в STL-алгоритм. Нелокальные -- можно, но речь не о них.

Gluk (Kazan)
И кто из них после этого ограниченный ???

C++-ные локальные функторы ограничены -- тяжело дотянуться до контекста (надо через указатели) и в STL-алгоритм не передать, это сильно портит жизнь. Delphi-йские локальные процедуры/функции ограничены -- нельзя взять их адрес и передать куда-нибудь, но это мало портит жизнь.

Gluk (Kazan)
авторТам есть замыкания или лямбда-функции?
Вам нужны лямбды ? Их есть у нас:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
template <class H, class T>
struct Cons
{ template <template <class,class> class M>
  struct L
  { typedef typename M<H,T>::R R;
  };
};

template <class P>
struct Car
{ template <class H, class T>
  struct L
  { typedef H R;
  };
  typedef typename P::L<L>::R R;
};

template <class P>
struct Cdr
{ template <class H, class T>
  struct L
  { typedef T R;
  };
  typedef typename P::L<L>::R R;
};

Это нагромождение шаблонов, а лямбда-функция -- это анонимная локальная функция, обычно короткая (часто умещается в одной строке).
Кстати, имена из одной буквы не добавляют понятности этому коду.

Gluk (Kazan)
автор
По-моему, использовать C++-шаблоны для мета-программирования в функциональном стиле -- это неудобно и нечитабельно (для большинства C++-программистов). К тому же, непонятно, как такую мета-программу отладить -- компилятор C++ не сообщает, что там у него внутри происходит.

Неудобно, но единственно возможно.

C++-шаблоны -- не единственный способ мета-программирования, есть способ лучше: генерация кода (мета-программа пишет программу). Этот способ доступен для всех языков, в том числе для Delphi. Один из плюсов: мета-программу можно отладить.

Gluk (Kazan)
Кстати, Вы действительно думаете, что я написал все это без отладки ?

Каким образом отлаживать мета-программу на C++-шаблонах? По мета-коду на C++-шаблонах не пройтись в отладчике. Если внести неверное изменение, то сообщение компилятора об ошибке будет невнятным.

Gluk (Kazan)
Вы мне определенно льстите :)

Я не столько льщу Вам, сколько указываю на неудобство и непрактичность мета-программирования на C++-шаблонах.
...
Рейтинг: 0 / 0
Программирование
    #35389872
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов
Польза от Delphi-йских локальных процедур/функций -- лёгкий доступ к контексту и лучшая структуризация кода.


Относительно этого чуть ниже. Кроме того, "лучшая структуризация" кода понятие сильно субъективное.

Пётр Седов
Если бы локальные функции были в C++, то пришлось бы меньше перекомпилировать: изменение внутренностей функции, написанной в .cpp-файле, не затрагивает заголовочный файл.


Имеете в виду, что если я объявляю вложенный класс, мне придется писать его реализацию в h-файле ??? Ничуть небывало :) Кто мешает мне вынести его реализацию в cpp ?
Кстати, для разрыва зависимостей есть куда более мощное оружие - интерфейсы

Пётр Седов
Обычно, когда твёрдо знают ответ, вопрос не задают ...
Второй вопрос заставляет усомниться, что Вы твёрдо знали ответ на первый


Ой, таки я Вас умоляю То была мааааленькая провокация :)
Не судите о людях по вопросам, можете сильно ошибиться.
Кстати, хоть к делу это и не относится, я зарабатывал на жизнь знанием Delphi с 1-ой по 7-ю версию. Один из образчиков моего творчества можете посмотреть в kuliba1000, искать NtxRO
(фамилию правда как обычно переврали, ну да бог с ней)

Пётр Седов
Я в этом обсуждении не использовал слово «неотъемлемый» или его формы


Действительно не использовал, прошу прощения. Значимость отдельных фич, появившихся в ФП часто возводят в ранг неотемлимых частей, вот и почудилось

Пётр Седов
Что является функциональным языком/программированием/стилем, а что не является -- это вопрос глубоко философский, мне его не интересно обсуждать


Тем не менее, Вам очевидно интересно делать громкие заявления о том, что Perl имеет большее отношение к ФП чем C++ ? Уверяю Вас, для Perl ФП ничуть не более естественно чем для последнего

Пётр Седов
C++-ные локальные функторы и Delphi-йские локальные процедуры/функции ...
Не подменяйте тему


Локальные классы в C++ имеют действительно весьма сильные ограничения, но как я Вам уже говорил, для меня более адекватной аналогией локальной функции является функтор внутри функтора (то есть вложенный класс). Так что я ни в коем случае не меняю тему, а лишь расширяю ее :)

Пётр Седов
C++-шаблоны можно использовать как функциональный язык для мета-программирования, но у этого около-языка куча минусов:


Для меня акценты стоят несколько по другому :) ФП - это единственный способ заниматься метапрограммированием с использованием C++ шаблонов

Пётр Седов
* Большинство C++-программистов им не владеет.


Большинство программистов владеют Lisp-ом ? Или Haskell-ем ???
Давайте не будем говорить за народ, аппелировать к большинству и т.п.
Будем говорить за себя ?

Пётр Седов
* Невозможно пройтись по коду в отладчике.


Об этом ниже. Отладка не обязана быть интерактивной

Пётр Седов
* Не поддерживаются floating point числа.
* Очень неудобно указывать строковые литералы (и вообще работать со строками).


Несомненно досадные ограничения :( Но кто без греха ???

Пётр Седов
Да, Вы правильно меня поняли. Для написания мета-программы в функциональном стиле, выполняющейся в compile-time, Boost не обязателен, C++-шаблонов достаточно. Boost нужен ради Boost.Lambda для написания программы в функциональном стиле, выполняющейся в run-time.


не согласен . Все врямя слышу, boost, boost ...
Он Ваш дедушка - Boost ???

Пётр Седов
Да, сложное. В том смысле, что для большинства C++-программистов это тайнопись. Но главное: я имел в виду функциональный стиль в программах, выполняющихся в run-time, а не в compile-time.
Напишите на C++ в функциональном стиле преобразование недетерминированного конечного автомата в детерминированный, выполняющееся в run-time. Вот тут и проявится различие между C++ и функциональными языками. В отличие от мета-кода на C++-шаблонах, код на Lisp-е можно выполнить в run-time.


Про большинство я уже говорил. А про RunTime - Задача преобразования НКА в ДКА совершенно элементарно решается на C++ императивно (в RunTime). Зачем усложнять решение, если плюсы от этого сомнительны, а минусы очевидны ??? С другой стороны, если нам нужно решить эту задачу в CompileTime, то ничего кроме ФП на помощь не придет.
Если Вас волнует практическая польза - это вполне может быть какой-нибудь CompileTime лексер.

Пётр Седов
Нет никакой сенсации в том, что C++ плохо подходит для написания программ в функциональном стиле, выполняющихся в compile-time или run-time. Для этого другие языки есть.


Нет никакой сенсации в том, что любые языки программирования неудобны для написания программ. Совершенство вообще стоит искать не в этом мире :( Что касается CompileTime, говорил и повторю еще - ФП единственный способ писать для него программы

Пётр Седов
Нагромождение шаблонов есть.


Покажите хоть один лишний ;)

Пётр Седов
Игрушечные примеры мета-программирования на C++-шаблонах (например, вычисление факториала) компилируются быстро. Но если делать что-то серьёзное, то компилируется долго.


NFA -> DFA для Вас недостаточно серьезно ? o O
Скомпилируйте да убидитесь - компилируется не долго
В противном случае, Ваша позиция сильно напоминает "Пастернака не читал, но осуждаю ..."

Пётр Седов
Попробуйте сделать parser C++ с помощью Boost.Spirit. Уверен, компилироваться будет долго. Слышал, что люди отказываются от Boost.Python именно из-за времени компиляции.


Простите, ЗАЧЕМ мне это делать, если я прекрасно обхожусь БЕЗ Boost-а ???

Пётр Седов
1. Локальный функтор не может по-простому использовать контекст, например, локальную переменную охватывающей функции


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include "stdafx.h"

struct A
{ int V;
  struct B
  { void operator()(A* a) {printf("%d\n",a->V);}
  };
  void operator()(int v)
  { V = v +  1 ;
    B b;
    b(this);
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    a( 10 );
    return  0 ;
}

Никак не пойму. Чем это хуже локальной функции ???

Пётр Седов
Выход -- сделать функторы нелокальными:
Но теряется локальность, и функторы надо упомянуть в заголовочном файле. Если захочется перейти от std::sort к собственному алгоритму сортировки (это разумно, если ключ -- целое число из небольшого диапазона), то придётся изменить содержимое заголовочного файла. Это вызовет избыточную перекомпиляцию.


Oh! Really ??? o O
Т.е. по Вашему раз я в предыдущем примере объявил A в cpp, а не в h-файле, он так таки сразу и стал локальным? И его нельзя будет передать в этот шаблон:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
template <class F>
struct C: public F
{ void operator()(int v) 
  { V = v;
    B b;
    b(this);
  }
};

Мессир, я в УЖАСЕ !!! (с)
Относительно мифических "перекомпиляций", я уже говорил - откройте для себя интерфейсы

Пётр Седов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
template <class H, class T>
struct Cons
{ template <template <class,class> class M>
  struct L
  { typedef typename M<H,T>::R R;
  };
};

template <class P>
struct Car
{ template <class H, class T>
  struct L
  { typedef H R;
  };
  typedef typename P::L<L>::R R;
};

template <class P>
struct Cdr
{ template <class H, class T>
  struct L
  { typedef T R;
  };
  typedef typename P::L<L>::R R;
};
Это нагромождение шаблонов, а лямбда-функция -- это анонимная локальная функция, обычно короткая (часто умещается в одной строке).
Кстати, имена из одной буквы не добавляют понятности этому коду.


А по мне так это аналог следующего кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

(define (cdr z)
  (z (lambda (p q) q)))

А также иллюстрация того, что шаблоны C++ можно рассматривать как ФВП :)
Вот уж поистине: "Один видит в луже только лужу, а другой, глядя в лужу, видит звезды" (с)
Для меня lambda не более чем способ вернуть из функции функцию. В разных языках, она может выглядеть ОЧЕНЬ по разному.
Кстати отсутствие лаконичности в Lisp не идет на пользу "понятности"
Ведь можно было написать просто: \m.mxy

Пётр СедовC++-шаблоны -- не единственный способ мета-программирования, есть способ лучше: генерация кода (мета-программа пишет программу). Этот способ доступен для всех языков, в том числе для Delphi. Один из плюсов: мета-программу можно отладить.


Потусторонними препроцессорами ? Несомненно ОЧЕНЬ удобно :)
И отлаживать тоже

Пётр СедовКаким образом отлаживать мета-программу на C++-шаблонах? По мета-коду на C++-шаблонах не пройтись в отладчике. Если внести неверное изменение, то сообщение компилятора об ошибке будет невнятным.


ФП поощеряет использовать небольшие функции с обозримой логикой. Отсутствие изменения состояний и побочных эффектов облегчает unit-тестирование. Большая программа складывается из мелких кирпичиков. Сначала проверяем корректность самых мелких, потом переходим на более высокие уровни.
Или для Вас отладка ассоциируется только с тупым жамканьем кнопочки 'Step' в какой нибудь красявой IDE ???
...
Рейтинг: 0 / 0
Программирование
    #35390045
Maykie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь топик не читал, но встряну, ибо обед обязывает.

Ынтырпрайз
Им вбили в 80-х паскаль, вот они теперь и думают, что п - самый лучший яп в мире.

Во всем мире латынью читается Си и Ява.
В MIT'е раньше преподавали scheme'у.
Счас заменили на питон ТЫНЦ ( см также ). Интересно у нас такое когда нить будт?
...
Рейтинг: 0 / 0
Программирование
    #35405533
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На питоне в самый раз обучать, на нём писать код легко и удобно, заодно сработает как прививка против ненависти к значимым отступам, и помешает лепить код как попало.

А про полчища шаблонов скажу, что я бы убивал за такой невнятный код. Я изучал шаблоны, делал упражнения, в общих чертах понимаю, но не вижу смысла лепить их такими кучами, что в каждой строчке комментарий нужен... Может это прочтение Александреску приводит к такому ужасу? Я его ещё не читал, пока другого чтива хватает. Помню когда на ассемблере писал, то комментариев много ставил, т.к. уже через месяц в своём коде сложно разобраться, не дело это, ещё и в языках высокого уровня всё усложнять настолько, что становится похоже на тайнопись.
...
Рейтинг: 0 / 0
Программирование
    #35406309
ytko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
холиварщики
...
Рейтинг: 0 / 0
Программирование
    #35406444
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoА про полчища шаблонов скажу, что я бы убивал за такой невнятный код.

внятность вещь сильно субъективная (мне например значимые отступы кажутся невнятными (не сработала прививка) особенно когда какой нибудь [censored] переводит статью вместе с примерами, ага дооооолго потом имеешь в виду что имел автор, после того как переводчег все значимые отступы таво ...)

и потом убивал бы где ? в продакте ? дык ты не поверишь, я бы тоже убивал
сто раз уж говорил, что я это воспринимаю исключительно как зарядку для ума
...
Рейтинг: 0 / 0
Программирование
    #35406602
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) XDiaBLoА про полчища шаблонов скажу, что я бы убивал за такой невнятный код.

внятность вещь сильно субъективная (мне например значимые отступы кажутся невнятными (не сработала прививка) особенно когда какой нибудь [censored] переводит статью вместе с примерами, ага дооооолго потом имеешь в виду что имел автор, после того как переводчег все значимые отступы таво ...)

Видал я книгу где весь код к левому краю прилип (причём в первой половине книги всё нормально было размечено), приходилось просто в папке с примерами копаться, благо исходники прилагались в электронном виде. Не помню что за книга, вроде Брюс Эккель "Философия C++".
Gluk (Kazan)
и потом убивал бы где ? в продакте ? дык ты не поверишь, я бы тоже убивал
сто раз уж говорил, что я это воспринимаю исключительно как зарядку для ума
А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе
...
Рейтинг: 0 / 0
Программирование
    #35407127
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoВидал я книгу где весь код к левому краю прилип (причём в первой половине книги всё нормально было размечено), приходилось просто в папке с примерами копаться, благо исходники прилагались в электронном виде. Не помню что за книга, вроде Брюс Эккель "Философия C++".


Видал я перевод одной статьи по Хаскелю с отбивкой :)
Мало того, что подстрочник, дык ишо и по исходникам прошлись (хорошо хоть не стилусом)
заботливо выровняв их в одну строку :)
Многа думал шо тупой (пока оригинал не нашел)

XDiaBLo
А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе

Ну такие вещи нигде не одобряются. Головоломные места в продакт коде встречаются, но до MP в полный рост пока не доходило. И не головоломные реализации этих мест гарантированно были-бы еще сложнее для понимания.
...
Рейтинг: 0 / 0
Программирование
    #35407836
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Видал я перевод одной статьи по Хаскелю с отбивкой :)
Мало того, что подстрочник, дык ишо и по исходникам прошлись (хорошо хоть не стилусом)
заботливо выровняв их в одну строку :)
Многа думал шо тупой (пока оригинал не нашел)

Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :)
Gluk (Kazan)
XDiaBLo
А, ну это сколько угодно :) Для развлечения можно делать всё что угодно :) Мне просто страшно представить, сколько будут искать мне замену, если я вздумаю уволиться написав такой код на работе
Ну такие вещи нигде не одобряются. Головоломные места в продакт коде встречаются, но до MP в полный рост пока не доходило. И не головоломные реализации этих мест гарантированно были-бы еще сложнее для понимания.
Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка.
...
Рейтинг: 0 / 0
Программирование
    #35407858
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLo
Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :)


Я такой же нуб как и ты :) факториал пишу по старинке, а не через Y-комбинатор :)
Ну максимум - хвостовую рекурсию задействую

IMHO совершенно не взаимосвязанный материал, посему нет разницы в каком порядке читать
можно параллельно. Перед "Искусством Программирования" имеет смысл "Конкретную математику" почитать, там дается матаппарат (но если не хочешь углубляться в математику, то и не надо).
В самом трехтомнике, мне лично, больше всего понравился 2 том. Заказывал тот перевод, что выпустили по 4 тому, да так и не дождался

А что за книжка по Хаскелю ?

XDiaBLo
Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка.

нуу комплексы это конечно хорошо (они облагораживают в конечном итоге)
но практика показывает, что эволюция всегда лучше чем "до основанья а затем ..."
сам сейчас в похожей ситуации, новый человек пришел, а в коде говнищаааааа
будем мээээдленннно и не спеша пырыписывть
...
Рейтинг: 0 / 0
Программирование
    #35407871
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) XDiaBLo
Пришла мне кстати книга по Хаскелю, может ближе к осени доберусь до неё... Или лучше её после Кнута? :)


Я такой же нуб как и ты :) факториал пишу по старинке, а не через Y-комбинатор :)
Ну максимум - хвостовую рекурсию задействую

IMHO совершенно не взаимосвязанный материал, посему нет разницы в каком порядке читать
можно параллельно. Перед "Искусством Программирования" имеет смысл "Конкретную математику" почитать, там дается матаппарат (но если не хочешь углубляться в математику, то и не надо).
В самом трехтомнике, мне лично, больше всего понравился 2 том. Заказывал тот перевод, что выпустили по 4 тому, да так и не дождался

А что за книжка по Хаскелю ?

По-моему вот эта Функциональное программирование на языке Haskell
Gluk (Kazan)
XDiaBLo
Хочу все программы на Java переписать, обмотать юнит-тестами и всё задокументировать подробно :) Чтобы не стыдно было другому программисту потом передавать, а то код грязный, на С++ Билдере сделанный, сто раз перелопаченный под очередные новые требования, местами регэкспы (boost::regex), местами самопальный уродский парсинг (наследие от прошлого программиста, которое пока не успел регэкспами заменить). Или лучше в Визуал студию перегнать? Там вроде тоже появились рефакторинг и юнит-тесты встроенные в среду, не уверен правда есть ли в бесплатной версии. Но в Билдере точно программы не оставлю, т.к. нелицензионка.

нуу комплексы это конечно хорошо (они облагораживают в конечном итоге)
но практика показывает, что эволюция всегда лучше чем "до основанья а затем ..."
сам сейчас в похожей ситуации, новый человек пришел, а в коде говнищаааааа
будем мээээдленннно и не спеша пырыписывть[src][/src]Лучше до основанья, в билдере всё равно оставлять не вариант, заодно получу ещё немного опыта работы на Java %) Поймать бы ещё момент, когда будет несколько дней подряд нечем заняться, так и переписал бы хоть одну программу на пробу. Программы то небольшие, по паре тысяч строк. Всего наверное тыщ десять строк в сумме будет, думаю быстро перепишу.
...
Рейтинг: 0 / 0
Программирование
    #35408026
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLo Gluk (Kazan)А что за книжка по Хаскелю ?

По-моему вот эта Функциональное программирование на языке Haskell


ее на rsdn-е поругивали вроде
...
Рейтинг: 0 / 0
Программирование
    #35408118
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) XDiaBLo Gluk (Kazan)А что за книжка по Хаскелю ?

По-моему вот эта Функциональное программирование на языке Haskell


ее на rsdn-е поругивали вроде
Навскидку только один нелестный отзыв нашёл. Да и какая разница? Мне бы только вкратце ознакомиться с основами. Для ознакомления с принципами функционального программирования. Там уж можно будет и мануалы посмотреть, если понадобится углубиться.
...
Рейтинг: 0 / 0
84 сообщений из 84, показаны все 4 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Программирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]