LINUX.ORG.RU

Функциональщина. Что выбрать?


0

0

Решил в свободное время заняться изучением модного нынче функционального программирования. Встал естественный вопрос: что выбрать? Этих всяких лиспов, хацкелей, оцамлей и т.п. вагон и маленькая тележка. Чтобы не распыляться выбрал Scheme, т.к. его используют в SICP, но настораживает его не слишком большая распространённость и «академичность». С другой стороны, лямбды и прочие «вкусности» потихоньку приходят и во всякие там питоны и даже плюсы. Не холивара окаянного ради, а сугубо для просвещения и развития спрашиваю: что изучать, чтобы не лежало оно потом мёртвым грузом? У каких языков какие плюсы, минусы и области применения?

★★★★

Последнее исправление: Gvidon (всего исправлений: 1)

Ответ на: Вопчем, слушай сюда от solom

> Не надо задавать вопросы типа: «где это сейчас применять?»

Как надоела эта демагогия. Языки программирования существуют исключительно для того, что бы писать программы. И если не собираетесь язык применять на практике, то лучше просто про него забить, а высвободившиеся время направить на борьбу с глобальным потеплением.

archimag ★★★
()
Ответ на: комментарий от Miguel

>что реально изобретено - это тип LispDo, всё остальное пишется почти единственным образом.

Ты сейчас упорот, или стебёшься?

Ну, а я сделал без метапрограммирования,

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

переменные цикла можно объявлять не только в его начале, но и в середине

они тоже объявляются в любом месте

Этого не нужно. Это минус - декларативную конструкцию превращают в императивную.

условий выхода может быть несколько (работает их дизъюнкциия) и

В лиспвском варианте тоже можно, предикат может даже ИО делать.

и заработало оно с первого раза (как только скомпилилось без ворнингов).

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

И как ты собираешься сравнивать выразительность, если не знаешь Хаскель?

Да тут уже с минимальными знаниями хаскела виден колоссальный слив статики( в форме хаскелла) на простейшей задаче, где потребовалось небольшое обобщение алгоритма. То есть выводы типов не спасут. Ну а что качается чистой функциональщины, видим что даже в очень простом случае МП на порядок полезнее и выразительнее чистой лямбды на стероидах.

Ну посмотри повнимательнее. В testLoop переменных две.

И обе одного типа.

anonymous
()
Ответ на: комментарий от anonymous

> Потому что статическая типизация и хаскелл этого не позволяют.

Я конечно не люблю хаскель, но не знать, что есть template haskell уже слишком.

anonymous
()
Ответ на: комментарий от archimag

> А GCL так вообще цирк, вообще ни одного проекта не припомню, который бы GCL официально поддерживал: если там что вдруг и заработает, то это будет чистая случайность...

Maxima в Debian'е поставляется как image и запускается именно GCL'ем.

k_andy ★★★
()
Ответ на: комментарий от k_andy

> Maxima в Debian'е поставляется как image и запускается именно GCL'ем.

Наверное потому, что Maxima в основном именно на GCL и разрабатывалась. Кажется, у неё вообще были проблемы с запуском на других реализациях (но вроде этот момент пилили). Подозреваю, что если бы не Maxima, то про GCL бы давно все забыли и повыкидывали бы из дистрибутивов.

archimag ★★★
()
Ответ на: комментарий от anonymous

>Я конечно не люблю хаскель, но не знать, что есть template haskell уже слишком.

Это вроде бы немного другой язык. Наверняка ещё более запутанный. И не факт что на нём решение будет намного лучше.

anonymous
()
Ответ на: комментарий от anonymous

> Это вроде бы немного другой язык. Наверняка ещё более запутанный.

Не, тот же хаскель, только с оксфордскими скобками.

anonymous
()
Ответ на: комментарий от archimag

Я написал: «не спрашивайте, где применять». Это отличается от «неважно, применяется он на практике или нет». У вас проблемы с пониманием прочитанного?

solom
()
Ответ на: комментарий от k_andy

Странно. А должен бы:

Compiles Lisp also with any C/C++ compiler.

Нет, я понимаю, конечно, что этого мало, но зачем тогда огород городить?

И развивается вроде активно...

anonymous
()
Ответ на: комментарий от solom

>Я написал: «не спрашивайте, где применять». Это отличается от «неважно, применяется он на практике или нет». У вас проблемы с пониманием прочитанного?

всётаки свежие знания лутше сразу закреплять практикой, чем откладывать на «когдато пригодится»

SV0L0CH
()
Ответ на: комментарий от anonymous

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

archimag ★★★
()
Ответ на: комментарий от solom

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

archimag ★★★
()
Ответ на: комментарий от archimag

Солдат учат убивать и уничтожать вражескую технику. Но сами они во время учений никого не убивают.

И, насколько я понял, речь идёт про ФП, а ФП != ЯП.

suzuki
()
Ответ на: комментарий от archimag

>Как надоела эта демагогия. Языки программирования существуют исключительно для того, что бы писать программы. И если не собираетесь язык применять на практике, то лучше просто про него забить, а высвободившиеся время направить на борьбу с глобальным потеплением.

Нет. А как же для собственного развития? Неужели не ясно? Скучные вы... Не получаются из таких(которым ничего не интересно) хорошие секари.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Ещё раз подчеркну-не имеет смысла задумываться о скорости работы, и прочих свойствах реализации, пока она используется исключительно для изучения! к тому же изучения не языка программирования самого по себе-вам понадобится из CL для изучения концепций ФП от силы 1% его возможностей, а качества реализации-играют роль лишь в очень малом количестве экспериментов при изучении. Скорее даже, вы будете экспериментировать с интерпретатором, написанным вами, работающим поверх вашей реализации, изменяющим свойства языка.

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

Есть однако и ещё одно замечание, не относящееся особенно к делу. Не только единым ФП жив человек. Для более глубокого исследования того вопроса, в каких направлениях можно развиваться, следовало бы заглянуть в CTM. Следовательно, разумно выбирать для изучения ФП те языки, которые быть может «поддерживают и другие парадигмы». Отправляйтесь в CTM за разъяснением термина «поддерживает парадигму».

В целом спор напоминает спор ремесленников и учёных-над тем, что удобно учёным (каковы их цели? вот, скажем Oz, тоже удобен для целей изучения различных концепций программирования, в т.ч. и ФП), ремесленники зачастую просто посмеются (и правильно сделают-не для практического применения). Вот только у ремесленников никогда не было бы удобных инструментов, что есть сейчас, без стараний учёных, и без их, зачастую, с виду бесперспективных в плане практического применения, идей.

Вспомните, например, в этом плане LR(k) синтксический анализ. Пока Кореньяк первым не показал, как эффективно реализовать LR(1) анализатор, его никто всерьёз не рассматривал. Пока не стала очевидной важность теории чисел в криптографии, многие ее разделы оставалась лишь чистой теорией, без видимых перспектив применения. Пока не был открыт алгоритм полной резолюции,... Дальше думаю перечислять не имеет смысла. И это вовсе не демагогия, заметьте.

Если человек хочет стать учнёым-зачем ему уподобляться ремесленнику?

anonymous
()
Ответ на: комментарий от anonymous

Ты сейчас упорот, или стебёшься?

Какое слово непонятно?

Потому что статическая типизация и хаскелл этого не позволяют.

Брешешь. Template Haskell не я придумал.

в лисповом варианте даже без знания лиспа можно суть уловить.

Ой, вряд ли. Не знал бы я лиспа - ни хрена бы не понял.

Этого не нужно. Это минус - декларативную конструкцию превращают в императивную.

do - декларативная конструкция??? Отсыпь.

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

код совсем не соответствует тому, что имелось в виду.

Чем именно не соответствует?

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

Аргументы?

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

Метапрограммирование НИКОГДА не преодолевает недостатков собственно языка.

И обе одного типа.

Не имеет значения, там может быть любой тип.

Miguel ★★★★★
()
Ответ на: комментарий от suzuki

> Солдат учат убивать и уничтожать вражескую технику.

Но сами они во время учений никого не убивают.


Написание программы подобно убийству или взрыву танка? Аморально и очень дорого?

archimag ★★★
()
Ответ на: комментарий от archimag

Смотря что подразумевать под «написанием реальных программ». На мой взгляд, если вы делаете игрушку размером до 10000 строк то это конечно не дорого ни а плане денег н- в плане времени. Но если идет речь о проекте на 5 лет,в пару миллионов строк-то да,дорого и подчас аморально:) если получившееся чудо не свободно,скажем,но является научным достижением.!

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

anonymous
()
Ответ на: комментарий от archimag

Я могу изучать язык не для того, чтоб писать на нём код. Например, хочу подсмотреть детали реализации/имплементации, и дальше взять себе понравившееся идеи и заюзать их в своём уютном dsl :)

suzuki
()
Ответ на: комментарий от anonymous

> что изучая концепции и методы программирования следует

использовать язык


Для изучения концепций и методов, равно как и повышения квалификации, надо изучать не язык, а реальный код, написанный другими программистами. Ибо только реальный код позволит оценить качество и важность идеи. При этом, действительно замечательных идей хватает в коде на разных языках, в том числе и на всеми презираемом PHP. Поэтому глубокий философский смысл «изучать, но не использовать» мне совершенно не ясен. Если язык хорошо, то почему на нём не писать? А если на нём нельзя писать, то зачем он вообще нужен? Зачем его вообще придумали?

archimag ★★★
()
Ответ на: комментарий от archimag

ты дибил? почему пристал к хаскелю? не хочеш, не изучай. Но не доказуй изучившим, что они проделали бесполезную работу. Они с тебя просто посмеются.

anonymous
()
Ответ на: комментарий от archimag

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

Подчеркиваю-это учебные программы и для обучения то, что нужно. Но это не практически примененимые программы.

Таким образом, обучаясь, мы и не пишем реальных программ. Но это не имеет значения, поскольку мы учимся концепциям. Значит и не имеет значения-не распространенность языка в реальных проектах.

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

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от archimag

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

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

suzuki
()
Ответ на: комментарий от archimag

> И если не собираетесь язык применять на практике, то лучше просто про него забить, а высвободившиеся время направить на борьбу с глобальным потеплением.

Глупости. Очень многие языки - переходные формы, на которых эволюция обкатывает новые подходы. Которые потом попадают в языки практические. Так что заниматься непрактичными языками необходимо. Без непрактичного уродского APL не было бы практичного, полезного J. Без кошмарной Modula 3 не было бы полезной Java. Без всяких там хаскеллей не было бы LINQ в C#.

anonymous
()
Ответ на: комментарий от archimag

Дурак. Зачем сейчас на QC пишут, если квантовых компьютеров нет и долго ещё не будет? Просто ты ремесленник, и тебе выше головы прыгнуть не светит.

anonymous
()
Ответ на: комментарий от anonymous

Пролог на Си - как два пальца перессать.

anonymous
()
Ответ на: комментарий от anonymous

> Таким образом, обучаясь, мы и не пишем реальных программ.

Я никогда не писал учебных программ и не могу понять, зачем их писать, когда вместо этого можно писать реальные, полезные программы. И с Common Lisp я познакомился потому, что Python и C++, которые были в тот момент моими основными инструментами, явно не подходили для решения стоящей тогда задачи. Надо просто работать над разными вещами, думать над тем что делаешь и практика сама выведёт на нужное и действительно полезное. Моя цель - писать хорошие программы, а не повышать своё ЧСВ.

archimag ★★★
()
Ответ на: комментарий от archimag

Ну да, зачем что-то читать и изучать? Берёшь и делаешь. Плевать, что получается какое-то посредственное говно.

Зачем читать чьи-то докторские, зачем лазить по citeseer'у и искать что-то, если можно взять и начать быдлокодить?

suzuki
()
Ответ на: комментарий от archimag

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

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

А между тем, если практика никого не вывела на идею написания собственного интерпретатора, то никто и не научится и не будет уметь их писать, следуя вашей логике. Или же будет уметь, какие нибудь простейшие вещи делать-кто же для вас сделает новые эффективные инструменты?

anonymous
()
Ответ на: комментарий от suzuki

>Ну да, зачем что-то читать и изучать? Берёшь и делаешь. Плевать, что получается какое-то посредственное говно.

Это один из способов тренировки. Желательно при этом делать действительно чтонибудь реальное и полезное. По мере изучения проводить многократный полный рефакторинг.

Зачем читать чьи-то докторские, зачем лазить по citeseer'у и искать что-то, если можно взять и начать быдлокодить?

Сделаное самостоятельно запоминается лутше и предохраняет от лишнего мусора в голове.

Может такой способ обучения и не всем подходит, но практикуется довольно часто, archimag подтвердит ;)

SV0L0CH
()
Ответ на: комментарий от suzuki

> Зачем читать чьи-то докторские, зачем лазить по citeseer'у и

искать что-то, если можно взять и начать быдлокодить?


Хм. У вас есть основания обвинять меня в быдлокодинге? Полагаю, что вы легко сможете их предоставить: часть моего кода открыта, ссылка есть в начале обсуждения.

А где можно ознакомиться с вашим кодом? Хочется убедиться, что Haskell помогает вам его (быдлокодинга) избежать.

Я правильно понял ваше утверждение?

archimag ★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от archimag

> Хм. У вас есть основания обвинять меня в быдлокодинге?

Твоё неприятие теории и очень сильный уклон на практику увеличивают вероятность быдлокода.

А где можно ознакомиться с вашим кодом? Хочется убедиться, что Haskell помогает вам его (быдлокодинга) избежать.

Я писал, что хаскель позволяет мне избежать быдлокодинга? Серьёзно?

Я правильно понял ваше утверждение?

Нет, неверно. Своей безличной критикой я пытаюсь показать, что есть очень много интересных (и полезных) вещей, недоступных при подходе «берёшь и пишешь», «лучший способ обучения - читать чужой код» (твои слова, за точными формулировками лезть лень, если силньно нужно - найду).

suzuki
()
Ответ на: комментарий от archimag

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

anonymous
()
Ответ на: комментарий от archimag

>Хочется убедиться, что Haskell помогает вам его (быдлокодинга) избежать.

На самом деле избежать быдлокодинга за счёт языка впринципе невозможно. Всегда найдутся особые умельци и мой первый код на Haskell тому подтверждение(сейчас не могу показать по некоторым чисто техническим причинам, потом может выложу в другом месте).

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

Кроме того есть Template Haskell - прямой аналог ваших макросов. Им делается всё то же самое что делается макросами потому в детали вдаватся не буду (на практике им пользовался всего только пару раз).

SV0L0CH
()
Ответ на: комментарий от SV0L0CH

> >Ну да, зачем что-то читать и изучать? Берёшь и делаешь. Плевать, что получается какое-то посредственное говно.

Это один из способов тренировки. Желательно при этом делать действительно чтонибудь реальное и полезное. По мере изучения проводить многократный полный рефакторинг.

Ты должен понимать, что, для чего, почему, как и зачем. Иначе это мартышкин труд/брутфорс программинг:

Tom Knight and the Lisp Machine

A novice was trying to fix a broken Lisp machine by turning the power off and on.

Knight, seeing what the student was doing, spoke sternly: “You cannot fix a machine by just power-cycling it with no understanding of what is going wrong.”

Knight turned the machine off and on.

The machine worked.

Сделаное самостоятельно запоминается лутше и предохраняет от лишнего мусора в голове.

лутше

Я не граммар-наци, но это просто @#$!@#*!

suzuki
()
Ответ на: комментарий от anonymous

> Вам-не нужен, а например ученому,

Да при чём здесь вообще учёные? Я грешным дело думал, что в данном разделе всё больше разработчики должны быть, а оказывается, что половина ЛОР-а это ученые. Хотел бы я быть учёным - остался бы физиком. Если вы учёный - у меня к вам вопросов нет, меня больше разработчики интересуют.

archimag ★★★
()
Ответ на: комментарий от suzuki

>есть очень много интересных (и полезных) вещей, недоступных при подходе «берёшь и пишешь»

Вариантом подхода «берёшь и пишешь» можно считать «переписать всё заново». и он даёт довольно много профита.

SV0L0CH
()
Ответ на: комментарий от suzuki

> Своей безличной критикой я пытаюсь показать

Я говорю на основание собственно опыта, который, очевидно, не может быть «безличным». Путём теоретический рассуждений можно прийти к чему угодно, поэтому любая теория должна иметь под собой экспериментальное обоснование, без которого на неё можно внимания не обращать (если вы, конечно, не учёный). Вот я и хочу понять, что, кроме рассуждений, вы можете привести в подтверждение своей позиции?

archimag ★★★
()
Ответ на: комментарий от archimag

> Я говорю на основание собственно опыта, который, очевидно, не может быть «безличным». Путём теоретический рассуждений можно прийти к чему угодно, поэтому любая теория должна иметь под собой экспериментальное обоснование, без которого на неё можно внимания не обращать (если вы, конечно, не учёный). Вот я и хочу понять, что, кроме рассуждений, вы можете привести в подтверждение своей позиции

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

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

Ты на уроках химии, физики, истории спал? Экспериментальное обоснование - это что вообще такое? Ты хочешь строить все теории на основе эмпирического опыта?!

Часто теория разрабывается вначале, а дальше подтверждается практикой (LHC, ага). ;)

suzuki
()
Ответ на: комментарий от suzuki

> Ты на уроках химии, физики, истории спал?

Часто теория разрабывается вначале, а дальше подтверждается практикой


Вот только не надо мне это рассказывать, у меня димплом физика и 3 года работы физиком (не преподователем). Новая теория появляется после того, как старая перестаёт объяснять новые экспериментальные данные. Теория не имеющая экспериментального доказательства - просто измышления, которые до проведения эксперимента никто всерьёз воспринимать не будет.

archimag ★★★
()
Ответ на: комментарий от archimag

> Новая теория появляется после того, как старая перестаёт объяснять новые экспериментальные данные. Теория не имеющая экспериментального доказательства - просто измышления, которые до проведения эксперимента никто всерьёз воспринимать не будет.

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

Shimuuar
()
Ответ на: комментарий от archimag

Действительно, я не удачно выразился. Попытка #2:

Я понял, ты спал на уроках математики. Или в математике всё имеет эспериментальные доказательства? :D

suzuki
()
Ответ на: комментарий от archimag

Теория не имеющая экспериментального доказательства - просто измышления, которые до проведения эксперимента никто всерьёз воспринимать не будет.

В принципе, согласен. Кто бы это суперструнщикам сообщил...

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

>Какое слово непонятно?

Скорее, в каком месте статическая типизация в хаскелле может быть полезна в реальном применении?

Брешешь. Template Haskell не я придумал.

Зачем он нужен? Как это поможет статической типизации?

do - декларативная конструкция??? Отсыпь.

Да, настоящий скрывает под собой механизм условных переходов и изменения переменных.

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

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

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

Нет. И ещё, например, сделать в лиспе что-то типа dotimes, dolist и т.д. - тривиально. В хаскелле без знания огромного кол-ва теории - никак. Необоснованная сложность есть, преимуществ не видно. Даже плюсовые шаблоны более юзабельными выглядят.

Аргументы?

Где ты в итерации разглядел стрелки, категории и т.д.?

Метапрограммирование НИКОГДА не преодолевает недостатков собственно языка.

Тогда с эквивалентными возможностями хаскелла всё еще хуже. Кстати, МП в лиспе не МП, а лишь следствие контроля времени вычисления через спец. форму.

Не имеет значения, там может быть любой тип.

Возможно, хотя конструкции LispDo (->) () Integer выглядят как-то сомнительно для простой итерации.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.