LINUX.ORG.RU

среда для clojure: emacs или vscode?

 , ,


0

2

Недавно пришлось настраивать среду разработки для окамля. Плагины для vscode оказались пшиком, емакс помог. Какова ситуация с clojure? Среды от jetbrains почему-то не вызывают восторга, но можно тоже рассмотреть.

Контекст: я более-менее свободно работаю в Common Lisp в slime в emacs, хотя последние годы это было крайне редко (на лиспе стал писать в своей оболочке «Яр»). В остальном мой любимый редактор - это VSCode. Скорее всего, если буду играть в clojure, там же будет и что-то другое, связанное с java, js, clojurescript. Т.е. всеядность среды тоже имеет значение. В Емакс я только с лиспом действительно много работал, к остальному не знаю даже, как подступиться.

★★★★★

Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

А ты думаешь, будешь хорошо разбираться в Clojure, не имея никакого понятия о Java? Советую вкатить хоть немного для общего понимания, как работает Java VM, и вообще получить представление о Java экосистеме.

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

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

«Потому, что они это могут, профессор!» (c)

Другими словами, в ситуации, когда git - дефолтная VCS везде, люди будут её выбирать просто потому, что они его знают и под него куча хостингов. Они могут так делать, их ничто не ограничивает.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от Nervous

А когда твоей программе нужно сгенерировать другую программу, начинаются манипуляции со строками? Не в курсе, как это делается в этих ваших хаскелях %)

В OCaml принято через синтаксические, работающие с ast препроцессоры, раньше это был Camlp4, сейчас PPX. Хотя PPX это уже не препроцессор, а полноценный расширятель языка, по мощности сопоставимый с макросами лиспа.

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

Если что, потенциально даже репл можно прикрутить в эти языки

Реплы к питону уже лет двадцать назад прикрутили, те же jupiter notebook это вообще одни из самых лучших реализаций реплов. Вообще репл уже и в статически типизированных компилируемых языках давно есть например в haskell и OCaml.

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

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

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

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

В C++ есть перегрузка операторов и метапрограммирование на шаблонах — макросы не нужны?

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

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

чем это лучше банальной функции

Тем, что не вычисляет аргументы

Так вам что нужно: макросы или не вычислять аргументы? Чтобы лениво вычислять аргументы, не обязательны макросы:

https://www.cs.cornell.edu/courses/cs3110/2019sp/textbook/ads/lazy.html
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/lazy-expres...

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

Потому, что они это могут, профессор

Потому что их проекты, как правило, настолько мелкие и настолько никому не нужные, что они вполне могли бы обойтись и без VCS вовсе. Но положено всегда создавать git репу, даже когда она не нужна. А вот если бы проект был очень большим и/или с кучей бинарников, то выяснилось, что использовать git в качестве репозитория они уже не могут.

Другими словами, в ситуации, когда git - дефолтная VCS везде, люди будут её выбирать просто потому, что они его знают и под него куча хостингов

Под Mercurial куча хостингов, просто их меньше, чем под Git. Но от этого их не стало мало, их по прежнему много под обе VCS. Как я уже писал, здесь основную, роль играют вопросы модности и стиля, то есть, как на тебя будут смотреть одноклассники, когда ты скажешь «у меня репозиторий на Mercurial».

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

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

Ты сечйас сравниваешь навык пользования калькулятором с лицензией линейного авиапилота. VCS — это изначально инструмент, который не должен мешать и отсвечивать, он просто должен выполять свою работу, а программист — свою. А в итоге все любятся с git вместо работы.

И да, я не спорю, что любиться с ним нужно не так уж много, но я напоминаю, что там очень скоро возникает ситуация, когда проще выкинуть такое VCS и начать использовать tar, diff, patch, rdiff, и прочее без ущерба производительности работы программиста. Разница, разве что, будет в том, что git стандартизирован, а собственные велосипеды — нет, но в остальном по трудозатратам получается одинаково.

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

Не очень понял твою мысль. Я говорю, что любой системе управления версиями придется учиться.

Можно выучиться Меркуриулу, многим он нравится. Но подпоброк в процессе обучения будет меньше, чем в случае с Гитом.

И если ты потом попадешь в фирму / опенсурс-коллектив, в котором используется Гит, а ты вляпаешься сорян за троллиг, попадешь в него в любом случае, тебе проидется учиться ЕЩЕ и Гит.

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

Я думал, эпоха лиспосрачей уже прошла.

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

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

А Template Haskell и Ocaml PPX — это не вторые миры?

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

Если убрать из лиспа макросы - какие у него останутся преимущества перед условным питоном или джаваскриптом

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

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

Они тупо разные, они не лучше и не хуже друг друга. Типа: чем язык Си хуже XML?. На чем лучше писать вебсайт: на фотошопе или на Visual Studio?

Вообще нерелевантно. И лисп, и питон - языки общего назначения с понятной нишей. Еще скажи, что питон нельзя сравнить с руби или js.

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

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

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

Некоторые люди рождаются слепыми, как им узнать преимущества зрения? Ну, кроме как по косвенным признакам.

Почему вообще в ML или хаскеле нет макросов — ты не задумывался? Подсказка: макросы убили Common Lisp.

Tell me moar.

В лиспе тоже есть этот «единый мир» + дополнительный. Какие у тебя претензии к макросам?

В «лиспе» — может быть. Но не в Clojure.

Чем принципиально отличаются макросы в кложе от макросов CL?

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

На F# можно писать ответственный код, на питоне — нет. Вот тебе и вся аргументация по зарплате.

Везде можно писать какой угодно код. F# дает чуть больше статических гарантий.

Там же? Или рынок для них столь незначительный, что они в нее не попали

Нет там данных по jruby и groovy. Даже по котлину есть, а по груви нету. И паскалей нету, прикинь?

Угадай почему, и как это связано с размером зп.

Сформулируй какую-то мысль тезисно, а то непонятно, к чему тут «скриптовость» кложи

Ну типа в СУБД обычно на стороне сервера выполняемая шняга зовется скриптами. Вот я и назвал скриптами.

Все понятно, это просто какой-то твой (у)личный сленг.

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

Как я уже писал, здесь основную, роль играют вопросы модности и стиля, то есть, как на тебя будут смотреть одноклассники, когда ты скажешь «у меня репозиторий на Mercurial».

Да Господи, причем тут одноклассники. От таких сравнений пахнет какой-то, прости за честность, ущербностью.

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

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

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

одноклассники впордяке, брат тоже жив, но когда bitbucket дропнул поддержку и сказал что УДОЛИТ все mercurial репы, перевелся на git. не, нуачо. лучше б перевелся на что-то другое конечно, теперь когда непонаслышке понял что git - куча браминьего поноса.

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

Сколько Lisp макросов ты написал до того как влез в этот спор? Можешь не говорить, я знаю что ни одного.

Классический blub paradox, о чем вы тут рассуждали две страницы я хз.

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

Реплы к питону уже лет двадцать назад прикрутили, те же jupiter notebook это вообще одни из самых лучших реализаций реплов

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

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

Это все неюзабельное нечто по сравнению с лисповым реплом

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

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

А что в смолтолковском лучше, чем в лиспе?

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

все остальное в питоновских ноотбуках лучше

Да епта, что там лучше-то? Ты вообще что с чем сравниваешь? Питоновские ноутбуки - для реального программирования не подходят, они подходят для дата саенса и «продемонстрировать концепт».

Хаскеллевский репл - да не смеши мои тапки, для интерактивности этот язык мало пригоден.

Смоллтолк не тыкал.

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

Шаблоны намного слабее макросов

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

Был же уже идеальный пример их реализации язык nemerle

Нифига он не идеальный. Работа с AST встроена и в стандартную либу питона — чем Nemerle лучше? Макросы Nemerly больше похожи на каргокультную попытку натянуть лисп на окамль.

Из популярных сиобразных языков сейчас только в rust есть слабое подобие таких макросов

Ты знаешь, когда я читаю в доках расто о том, что макросы — это просто, то у меня возникает мысль «лучше бы этих макросов не было». Потому что это уже что-то по сложности сравнимое с отдельным парсером в AST с преобразованием онного.

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

Я другой анон, но я отвечу.

Чем шаблоны слабее макросов?

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

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

Доброжир, епта.

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

все остальное в питоновских ноотбуках лучше

Я работал с питоновскими ноутбуками, а ты с лисповым реплом нет - вот и вся суть истории. Поэтому и сравнить ты их не можешь.

да и хаскелевский репл тоже неплох

Опиши процесс, как происходит разработка в хаскеле в repl.

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

И если ты потом попадешь в фирму / опенсурс-коллектив, в котором используется Гит, а ты вляпаешься сорян за троллиг, попадешь в него в любом случае, тебе проидется учиться ЕЩЕ и Гит

Я понял твою мысль: ты не любишь учиться. Мое отличие заключается в том, что я люблю учиться, но не люблю страдать. Потому я совершенно не почувствовал SVN и Mercurial, и словил неожиданно много трудностей с git. Один из важных принципов, которые нужно соблюдать, чтобы продолжать сохранять способность воспринимать новую инфу — это не превращать свою голову в мусорный бак. А как не превращать ее в мусорник, когда ты читаешь очередное:

«In the default overlay mode, git checkout never removes files from the index or the working tree. When specifying --no-overlay, files that appear in the index and working tree, but not in <tree-ish> are removed, to make them match <tree-ish> exactly»

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

Git — это инструмент для мейнтейнера ядра линукс. Если ты не мейнтейнер ядра линукс, то тебе не нужен git, потому что иначе тебе нужно будет стать мейнтейнером ядра линукс, даже если ты пишешь hello world. Более того, организация коммерческой разработки, как правило, отличается от организации разработки ядра линукс — это, как правило, централизованность и минимальные различия сорцов между членами команды, правки вносятся лично каждым членом команды, а не через мейнтейнера, ревью же делает на испытательном сроке или при приеме правок не от члена команды. Потому навыки мейнтейнера ядра линукс слабо помогут при коммерческой разработке.

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

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

А Template Haskell и Ocaml PPX — это не вторые миры?

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

Зачастую на таком метапрограммировании пишут всякие сериализаторы и прочие интерфейсные штуки. Однако же, нередко эти самые интерфейсы определены не в коде вовсе. Типичный пример — биндинги к GTK/Qt, где описания интерфейсов находятся отдельно, потому через внутриязыковое метапрограммирование сгенерировать по этим интерфейсам код не получится. Или какой-нибудь protobuf, где описание протоколов кроссплатформенно.

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

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

Clojure это СУБД, а не язык

внезапно: Git object storage это тоже ОО СУБД + конструктор скриптов «сделай сам из этого VCS» + дистрибутив таких скриптов, а не что-то ~плохое~ готовое VCS.

если ты считаешь что кложа это СУБД на STM-ках + скрипты акторами, то чем тут хуже? Git object storage это ООСУБД с файлами-блобами объектов + метаданные (индекс, деревья, ветки, метки, вот это всё).

дядя, скажи как мне достать сорцы предыдущей версии

познай структуру хранилища гитового объектноблобового.

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

лучше скажи в чём прелести пипифакса PPX-а вместо Camlp4.

так-то понятно что AST типизированный, ну а вообще?

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

И лисп, и питон - языки общего назначения с понятной нишей. Еще скажи, что питон нельзя сравнить с руби или js

Я уже отвечал несколько раз, что питон не является языком общего назначения. Это язык скриптования для никсов. У него спустя 30 лет до сих пор нет норм поддержки консоли на винде, например. А если пытаться использовать его для чего бы то ни было, что требует производительности, будь то сервис или GUI, то внезапно выясняется, что требуется куча непитоновых костылей, чтобы это работало более-менее адекватно.

Точно так же JS 15 лет не был ЯП общего назначения, пока кому-то не стрельнула в голову идея таки сделать его ЯП общего назначения — однако же, получился другой язык, который весьма плохо портируется на браузерный JS, ровно как и плохо портируется обратно.

Еще скажи, что питон нельзя сравнить с руби или js

Интерпретаторы CPython, Ruby, и Node.js находятся в одной нише. Но не браузерный JS.

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

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

Некоторые люди рождаются слепыми, как им узнать преимущества зрения?

А с чего ты взял, что ты — зрячий?

В лиспе тоже есть этот «единый мир» + дополнительный. Какие у тебя претензии к макросам?

В «лиспе» — может быть. Но не в Clojure.

Чем принципиально отличаются макросы в кложе от макросов CL?

В CL можно вычислять макросы во время выполнения. В Clojure — нет.

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

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

потому что eDSL. см. книжку «DSLs in action» – там правда примеры на руби груви и прочей попсе, ну и юзают платформу с батарейками как среду в которую погружён такой DSL.

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

потому что семантика внешнего DSL сложнее.

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

Везде можно писать какой угодно код. F# дает чуть больше статических гарантий

Не просто чуть больше статических гарантий — он дает больше гарантий, что твоя программа не упадет внезапно из-за бага в реализации стандартной библиотеки. Меньше, чем аналоги на JVM, но больше, чем CPython.

Нет там данных по jruby и groovy. Даже по котлину есть, а по груви нету. И паскалей нету, прикинь?

Угадай почему, и как это связано с размером зп

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

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

это ты ещё про FEXPRы не слышал

Да пофигу мне эти fexpr. Лисп был хорошим исследовательским языком, лисп сдох. Примерно как алгол 60. Только алгол 60 закопали, а лисп еще лежит воняет.

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

на тему семантики: понятие first class object сущностей означает объекты/парадигмы, которые язык может создавать непосредственно, невозбранно

например, если функциональный язык. first class object функции, анонимные, замыкания, продолжения – а не процедурные типы/указатели на функции.

например, если язык объектно-ориентированный. first class object метаклассы как тип класса = тип объекта = тип инстанса.

то есть, теория языка замкнута по first class object

например, datasource в языке (R тот же). datasource = first class object

например, логические языки типа пролога. метациклический интерпретатор в пару строк из-за того что терм без аргументов или с аргументами – first class object

например, Idris какой-нибудь с зависимыми типами. интерфейсы (тайпклассы) и зависимые типы = first class object

для сучностей второго класса и прочих негров происходит стирание типов.

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

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

Так кто тогда создает астрономическое количество репозиториев на github с кодом очень низкого качества? Мадам за 40, у которых дети уже участя в шараге/институте, и теперь они со скуки пишут либы? Или ты все-таки признаешь, что это дело рук школьников, которые первым делом идут писать велосипеды, и первым делом берут для этого git.

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

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

ну и макросы как механизм этого конструирования. понятно, что staged вычисления в каком-то MetaOcaml/Template Haskell/Terra продвинутей – но: хоть так.

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

когда bitbucket дропнул поддержку и сказал что УДОЛИТ все mercurial репы, перевелся на git. не, нуач

Удалил bitbucket репы на ртути — дальше что? Каким образом это может хоть как-то помешать разработке? Кроме bitbucket в мире нет хостинга?

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

Сколько Lisp макросов ты написал до того как влез в этот спор? Можешь не говорить, я знаю что ни одного

Да, ни одного. И что, каким образом это опровергает хотя бы один мой аргумент?

Классический blub paradox, о чем вы тут рассуждали две страницы я хз

Не вижу в треде ни одного примера blub paradox. Даже сообщение с явным упоминанием некоего выдуманного языка упоминало язык с ограниченными возможностями по сравнению с реально существующим языком. Так что чини детектор.

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

И что, каким образом это опровергает хотя бы один мой аргумент?

огласи весь список аргументов.

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

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

потому что eDSL. см. книжку «DSLs in action»

Ты даже толком не ответил на этот вопрос, но зато успел написать

потому что семантика внешнего DSL сложнее

byko3y ★★★★
()
Последнее исправление: byko3y (всего исправлений: 1)
Ответ на: комментарий от anonymous

на тему семантики: понятие first class object сущностей означает объекты/парадигмы, которые язык может создавать непосредственно, невозбранно

Во-первых, «first class» — это слишком абстрактное и размытое понятие, чтобы от него отталкиваться. Во-вторых, на что ты мне вообще отвечал?

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

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

Может ты мне еще расскажешь, что на питоне можно написать за минимальное время интерпретатор ML? На лиспе легко писать только лиспоподобные языки, а синтаксис лиспа не так уж и удобен.

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

во-первых, огласи список аргументов и тезис, к которому аргументы.

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

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

лучше скажи кто и зачем создаёт монорепы на 300 гигов в одной репе

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

Более актуален твой вопрос по отношению к монорепе гугла, в которой 86 терабайт кода — вот тут мне и правда неясна мотивация.

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