ГА>fun imperative fact (n:int) =
ГА>let
ГА> val result = ref 1
ГА> val i = ref 0
ГА> fun loop () =
ГА> if !i = n then
ГА> ()
ГА> else
ГА> (i := !i + 1;
ГА> result := !result * !i;
ГА> loop ())
ГА> in
ГА> loop (); !result
ГА> end
ГА>
Да, про рефы забыл ГА>Конечно, все это выглядит достаточно некрасиво и неудобно, чтобы в таком духе писать программы полностью, но в низкоуровневом коде встречается (в реализации массивов, хэш-таблиц, потоков I/O).
+1
ГА>Весь ввод/вывод в ML является императивным. В стандарте языка есть библиотека функционального ввода-вывода, но реализации ее я не видел (ни в Moscow ML, ни в SML/NJ).
Все общение с железом императивно.
ГА>Кроме того, в базовых библиотеках как SML, так и OCaml есть массивы и хэш-таблицы — mutable структуры данных.
Но они передаются но не хранятся. Все что нельзя редуцировать ГА>Ну и т.д., reference cells — это и есть, собственно, "состояние внутри функции".
Согласен.
ГА>Поэтому с одной стороны, языки семейства ML более легки в освоении для программистов-императивщиков и считаются более практичными
Вот это абсолютно точно. Не знаю про программаистов имеративщиков, но строгость SML меня поразила. После пары подходов к CLISP мне хотелось повесится.
Здравствуйте, шапокляк, Вы писали:
Ш>Я тут конешно новенькая и меня легко затоптать. Но сложите 2 и 2. Лауреаты премии Тьюринга люди не святые. Но коли с ними переходят на личности то уж никак не от большова ума. И што тут спорить? Ну а научный уровень Линуса Торвальдса можно даже не обсуждать. Хотя я не удивлюсь если его протолкнут в лауреаты Тьюринга. Такова жизнь.
Честно говоря, я бы дал премию Страуступу. Можно долго мучится вопросом насчет недостатков и достоинств языка и научной ценности, но то что его детище кардинально повлиял на все сообщество на десятилетия — отрицать нельзя. Это влияние нельзя переоценить.
Здравствуйте, Cyberax, Вы писали:
C>Паскаль был абсолютным хитом в свое время — хороший, продуманый, простой C>язык. Он оказал влияние на кучу последующих языков, и до сих пор C>используется для обучения. Одно это тянет на премию Тьюринга
+1
C>Вот только потом у Вирта начались непонятки с Модулами и Оберонами — они C>фактически уже не добавляли ничего нового, по сравнению с уже C>существовавшими языками.
Вирта сильно недолюбливали за то что он был наиболее последовательным и рьяным критиком Паскаля. Он его считал промежуточным звеном для построения промышленного языка.
C>Вирт успешно пропустил распространение C>объектно-ориентированного,
Честно говоря он ничего не пропускал. Ты судишь по Паскалю. Просто он занялся компонентным программированием. И задолго до того как компонентное программирование стало промышленным. Просто человеку сложно понять что между требованиями к научным языкам и промышленными совершенно разные. И процесс внедрения тоже разный.
Здравствуйте, GlebZ, Вы писали:
ГА>>Весь ввод/вывод в ML является императивным. В стандарте языка есть библиотека функционального ввода-вывода, но реализации ее я не видел (ни в Moscow ML, ни в SML/NJ). GZ>Все общение с железом императивно.
Тут надо поосторожнее. Дело не в железе, т.к. можно докатиться до логики "раз все языки компилируются в ассемблер, они по сути императивны". Тут дело в мат. модели. В ML решили не усложнять: операции, изменяющие состояние, имеют тип unit, порядок выполнения инструкций гарантирован, но практически любая функция может иметь побочные эффекты (хотя естественно, их избегают без необходимости):
let add_with_side_effect x y =
let ret = x + y in
(print_int ret; ret)
(* вызов print_int никак не влияет на тип функции,
это по-прежнему int->int->int *)
Как быть в чисто функциональном языке? А особенно в ленивом, в котором порядок вычислений определяется компилятором и зависимостью по данным?
Очень грубо говоря, выход такой: любая функция с побочными эффектами считается функцией, которая вычисляет новое состояние мира из старого, т.е. из императивного кода
Где-то смутно ощущаю, что IO-монада и do-нотация в Хаскеле примерно это и делает, только с синтаксическим сахаром (просьба ногами не бить, с теорией категорий не знаком, с Хаскелем знаком по туториалам и паре самостоятельно выполненных "Hello cruel world" в Hugs, это мое интуитивное понимание на сегодняшний день. А т.к. Haskell is a language of choice for discriminating hackers, я с ним еще обязательно разберусь получше ).
ГА>>Кроме того, в базовых библиотеках как SML, так и OCaml есть массивы и хэш-таблицы — mutable структуры данных. GZ>Но они передаются но не хранятся. Все что нельзя редуцировать
Вот здесь не уверен, что понял тебя.
ГА>>Поэтому с одной стороны, языки семейства ML более легки в освоении для программистов-императивщиков и считаются более практичными GZ>Вот это абсолютно точно. Не знаю про программаистов имеративщиков, но строгость SML меня поразила. После пары подходов к CLISP мне хотелось повесится.
Надо, Федя, надо . Если интересуешься ФП, без SICP никуда, а там не обойтись без Лиспа (точнее, Scheme).
GlebZ wrote:
> C>Вот только потом у Вирта начались непонятки с Модулами и Оберонами — > они > C>фактически уже не добавляли ничего нового, по сравнению с уже > C>существовавшими языками. > Вирта сильно недолюбливали за то что он был наиболее последовательным > и рьяным критиком Паскаля. Он его считал промежуточным звеном для > построения промышленного языка.
И тем не менее, именно Паскаль (с небольшими добавлениями в виде
break/continue, типизированых констант и т.п.) стал промышленным языком.
Модулы и Оберон уже не имели даже близкого по масштабу влияния на индустрию.
> C>Вирт успешно пропустил распространение > C>объектно-ориентированного, > Честно говоря он ничего не пропускал. Ты судишь по Паскалю. Просто он > занялся компонентным программированием.И задолго до того как > компонентное программирование стало промышленным.
Промышленное КОП появилось с появлением VB. И фактически в области
визуального программирования и осталось. Влияния Вирта тут я уже не вижу
— скорее развитие логически шло от визуальных контролов на формах к их
представлению в виде отдельных пакетов.
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>world1 = do_smth1 world0 ГА>world2 = do_smth2 world1 ГА>world3 = do_smth3 world2 ГА>[/code] ГА>Где-то смутно ощущаю, что IO-монада и do-нотация в Хаскеле примерно это и делает, только с синтаксическим сахаром (просьба ногами не бить, с теорией категорий не знаком, с Хаскелем знаком по туториалам и паре самостоятельно выполненных "Hello cruel world" в Hugs, это мое интуитивное понимание на сегодняшний день. А т.к. Haskell is a language of choice for discriminating hackers, я с ним еще обязательно разберусь получше ).
Нет-нет, в случае IO Monad все совсем не так, все гораздо проще
я чуть попозже напишу поподробнее почему ни состояния ни ввод-вывод не являются никакой проблемой в хаскеле вообще и в любом языке в принципе, поддерживает он императивный ввод вывод или нет. Сейчас времени нет — там немного длинно получится.
Тема безумно интересная и важная.
Здравствуйте, Трурль, Вы писали:
R>>Вообще в чем проблема, квалифицированному программисту выучить любой язык, если очень нужно — полдня максимум
Т>Тут недавно на смех подняли человека, который утверждал что знает C++, попрограммировав на нем всего год. Т>Где же правда
Тут есть люди, которые понимают, о чем идет речь в топике Стагнация?
Здравствуйте, reductor, Вы писали:
R>Нет-нет, в случае IO Monad все совсем не так, все гораздо проще R>я чуть попозже напишу поподробнее почему ни состояния ни ввод-вывод не являются никакой проблемой в хаскеле вообще и в любом языке в принципе, поддерживает он императивный ввод вывод или нет. Сейчас времени нет — там немного длинно получится. R>Тема безумно интересная и важная.
Ждем-с с нетерпением.
Здравствуйте, Трурль, Вы писали:
Т>Здравствуйте, reductor, Вы писали:
R>>Вообще в чем проблема, квалифицированному программисту выучить любой язык, если очень нужно — полдня максимум
Т>Тут недавно на смех подняли человека, который утверждал что знает C++, попрограммировав на нем всего год. Т>Где же правда
Правда и там и там.
Человек, для которого С++ — первый или второй язык программирования в жизни действительно не будет знать его хорошо даже за год (особенно, если не будет стараться проникнуть в язык поглубже).
Человек же, который знает необходимый набор классических (оказавших фундаментальное влияние на развитие других) языков + знаком с одним/двумя суперсовременными, выучит с++ очень быстро. Причем глубина его понимания запросто может оказаться побольше, чем у человека, который на с++ программировал 10 лет, но никаких языков больше не знает.
Ни один язык не является замкнутой системой — идеи и способы реализации кочуют туда-сюда и то, на понимание чего в случае первого знакомства требуется два месяца, человек эрудированный просто отметит про себя — ага, это как в языке x, а это как в x', но через механизм z из языка y
То же справедливо и для естественных языков. профессиональные лингвисты учат их очень быстро и так же забывают, когда отпадает необходимость.
Здравствуйте, reductor, Вы писали:
R>Правда и там и там. R>Человек, для которого С++ — первый или второй язык программирования в жизни действительно не будет знать его хорошо даже за год (особенно, если не будет стараться проникнуть в язык поглубже)...Ни один язык не является замкнутой системой — идеи и способы реализации кочуют туда-сюда и то, на понимание чего в случае первого знакомства требуется два месяца, человек эрудированный просто отметит про себя — ага, это как в языке x, а это как в x', но через механизм z из языка y
Все так, но для продуктивного программирования нужно еще и "руку набить", и о распространенных граблях знать, и не лезть поминутно в справку, а еще есть (стандартная) библиотека, которую изучать и изучать.
Потому переход с более сложного С++ на (вроде бы) более простые C# или Java — вовсе не минутное дело.
з.ы. Я очень надеюсь, что изучение Лиспа и Хаскелла откроет мне третий глаз, и с чакрами все станет в порядке, но новый язык за полдня — ИМХО, преувеличение.
Здравствуйте, reductor, Вы писали:
R>Человек, для которого С++ — первый или второй язык программирования в жизни действительно не будет знать его хорошо даже за год (особенно, если не будет стараться проникнуть в язык поглубже). R>Человек же, который знает необходимый набор классических (оказавших фундаментальное влияние на развитие других) языков + знаком с одним/двумя суперсовременными, выучит с++ очень быстро. Причем глубина его понимания запросто может оказаться побольше, чем у человека, который на с++ программировал 10 лет, но никаких языков больше не знает.
И если вы спросите у Сани умеет ли он играть на гитаре, то он вероятно скажет что он виртуоз, и что еще он гений бас-гитары и кудесник барабанов.
Никогда не поверю, что C++ можно выучить очень быстро и начать на нем грамотно программировать. Особенно с сегодняшним уклоном в шаблоны, метапрограммирование и expression templates...
Я и сам "13 Years of C++ and still learning"
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Никогда не поверю, что C++ можно выучить очень быстро и начать на нем грамотно программировать. Особенно с сегодняшним уклоном в шаблоны, метапрограммирование и expression templates...
Да легко. Видел достаточно много примеров. Достаточно хороший код но с достаточно узким кругом инструментов. Ну например метапрограммирования, за последние 13 лет я никогда не использовал. И вообще когда встречаюсь с ним(а встречался только на rsdn), пугаюсь.
Здравствуйте, GlebZ, Вы писали:
GZ>Во-вторых, Вирт с его страстью к упрощению здесь сыграл положительную роль. И я сомневаюсь что кто-то меня опровергнет.
+1
жаль, что позднее его страсть к упрощению пошла совсем не туда, куда надо
Здравствуйте, GlebZ, Вы писали:
GZ>Имеет право. Он Оберон-то лучше знает.
давай не будем начинать спор по новой, ок?
чтобы иметь право разбрасываться такими откровенно оскорбительными обвинениями, нужно иметь объяснения — "а почему, собственно?" и доказательства сего факта
ни того, ни другого у него нет
если уж прослеживать параллели, то Смоллток имеет куда больше права называться прародителем Явы. Но разработчики Смоллтока почему-то не жалуются про это на лекциях.
GZ>Где он такое говорил? Ссылку. Я слышал от него другие слова.
поищи — здесь было несколько тем с обсуждениями его лекций
возможно конечно, что переводчики или авторы топиков переврали — но подобные утверждения были в нескольких местах
GZ>Это я тоже не слышал в его исполнении.
там же
Д>>Потому что его синтаксис очень простой, и это одним махом решает все существующие проблемы программирования. GZ>Почти так была информация. Только откуда взялось все существующие проблемы?
откуда взялись проблемы, намного лучше пишет Брукс. но синтаксис здесь уж совершенно точно ни при чем
GZ>Ты сам своими словами пытаешься сделать из него идола.
я? это как?
Д>>4. Оберон никто не использует, потому что ему нигде не обучают. И вообще, все вокруг сговорились, чтобы вытеснить Оберон с рынка. Д>>и так далее, и тому подобное GZ>1. Вообще-то Оберон кое-где изучают.
значит, еще один камень в огород Вирта
GZ>2. Лично я ему такое высказывание прощу(хотя дословно оно было другое). Обидно человеку.
нужно не обижаться, а думать — что было сделано неправильно? Вместо того, чтобы делать очередной никому не нужный язык.
GZ>Но вот невежественными их назвать не могу.
то, что он говорит про ФЯ, по другому я назвать не могу
GZ>Не идолопоклончество. А уважение. Это разные вещи.
банить за любую критику в адрес какого-то человека — это просто уважение?
Здравствуйте, Cyberax, Вы писали:
C>И тем не менее, именно Паскаль (с небольшими добавлениями в виде C>break/continue, типизированых констант и т.п.) стал промышленным языком. C>Модулы и Оберон уже не имели даже близкого по масштабу влияния на индустрию.
+1
C>Промышленное КОП появилось с появлением VB.
Вопрос на засыпку, а ты можешь описать разницу между модульностью и компонентностью? Этот вопрос настолько узкий, что я подчас сам не понимаю этой разницы. C>И фактически в области C>визуального программирования и осталось.
Нет. В честь чего? COM объекты, которые безусловно компонентны не являются областью компонентного программирования. Так же как и на их основе DCOM. C>Влияния Вирта тут я уже не вижу C>- скорее развитие логически шло от визуальных контролов на формах к их C>представлению в виде отдельных пакетов.
Да нет. Тут как раз именно Вирт был впереди планеты всей. На вопрос является ли наш постылый Oberon компонентным языком, можно ответить что да, является. Правда в несколько интересном формате, но это факт.
Здравствуйте, Дарней, Вы писали:
E>>Давай определимся с критериями успешности.
Д>успешность — это востребованность продукта сообществом Д>ведь не для марсиан же он работал, верно?
Кажется, где-то проскакивала информация, что систему управления метрополитеном в какой-то европейской столице толи на Modula-2, толи на Oberon реализовали. Так что продукт востребован.
БелАЗы, например, ты крайне редко увидишь. И выпускается их мало. Но ведь это не означает, что они не востребованы.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.