Форум
Компьютерные священные войны
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, vdimas, Вы писали: V>Здравствуйте, samius, Вы писали: V>>>Если язык позиционирует себя как статически-типизируемый, то обязано было бы. S>>Паскаль статически типизируемый. Попробуй на нем! V>Я еще в школе учился, когда уже попробовали: V>[q] V>Object Pascal (с англ. — «Объектный Паскаль») — язык программирования, разработанный в фирме Apple Computer в 1986 году. V>Введена перегрузка процедур и функций. V>[/q] V>:))) V>>>Напротив, я записал её абсолютно верно, т.е. именно так, как требуется писать в статически-типизируемом языке, поддерживающем (якобы поддерживающем) параметрический полиморфизм. S>>IndexOf не параметрический метод V>Садись, два. V>[cs] V>public int List<T>::IndexOf(T item) {} V>public static int Array::IndexOf<T>(T[] array, T value) V>... V>[/cs] V>>>А мне надо не два, а один перегруженный метод. S>>Понятно. То что тебе надо, я отменить не в силах. V>Ты-то тут причём? Речь про дотнет. V>Дотнет на сейчас не в силах. ОК. V>Не сомневаюсь, что рано или поздно станет в силах. V>Там нагнали нейтивных программистов, они наведут порядок в этом бардаке. :xz: V>>>Да не пытаюсь я отделаться от ad-hoc, мне он нравится. V>>>Я лишь показываю, что ad hoc полиморфизм в дотнете недоделан для случая генериков. S>>Разве я предлагал обсуждать доделанность дотнета, прежде чем мы договоримся о терминах? V>Наоборот, шло обсуждение недоделанности дотнета, в ходе которого выяснились разночтения по терминам. V>Но это НЕ важно для целей демонстрации недоделаности дотнета. V>Бо я тебе и без терминов, НА ПАЛЬЦАХ и примерах, в том числе приводя аналогичные примеры на С++ и Хаскеле уже всё показал, что с дотнетом не так. V>Я могу повторить свои объяснения в любой абстрактной терминологии, которая не пересекается с имеющейся. V>Вот давай назовём одно сепульками, другое ардритами, договоримся где-то. Спорный момент (совместная работа ad hoc и параметрического П) давай назовём энтеропией. Мне несложно объяснить в любых координатах. Но это не отменяет того, что тебе сложно ПОНЯТЬ. :xz: V>>>Это уже за рамками рассматриваемого метда. V>>>Ведь у нас наблюдается [b]декомпозиция[/b]: V>>>- есть параметрически полиморфная ф-ия IndexOf над семейством типов IList<T> where T : IEquatable<T>; S>>нету такой. V>Опять плаваешь по основам. V>Я рядом советовал тебе освежить паттерн "Шаблонный метод". V>Так вот, тот IndexOf, который работает через компарер, - это классический пример этого паттерна. S>>Есть ad-hoc полиморфная. V>Сам IndexOf или вызываемый изнутри неё метод компарера? V>>>Что всё вместе оно начинает работать уже на этапе компиляции и не потребует хакать систему типов в рантайм. S>>Работает и хакать не требует, верно. V>Сейчас требуется хакать. V>Из-за стирания типов невозможно создать требуемый компарер простой операцией new. V>>>В общем, ждем допиливания дотнета до работающего варианта. S>>Ты жди, а по мне оно УЖЕ работает. V>Для 2017-го года негусто, если в библиотеке http://www.rsdn.org/forum/prj.codejam требуется кодогенерация/клонирование для повышения эффективности. V>>>>>Параметрический полиморфизм НЕ требует работы ф-ии на ЛЮБЫХ входящих типах. [b]Достаточно работы на более одном типе[/b]. S>>>>ЧТО??? По-твоему любая мономорфная функция параметрически полиморфна? V>>>По-моему, путать "моно-" и "поли-" грешно. S>>Но функция, работающая на одном типе мономорфна. Или я что-то пропустил? V>Упустил выделенное. V>Троллишь, не? V>>>Я тебя понил. Вопрос: откуда ты вообще взял, что эти виды полиморфизма взаимоисключающи? Не видишь, разве, что это принципиально разные способы, которые нигде не пересекаются и не конфликтуют, т.е. прекрасно работают совместно? S>>Для деления PP/AH это не верно. V>Я задал тебе прямой вопрос - покажи мне утверждения про [b]взаимоисключащие[/b] признаки таких видов полиморфизма. V>Во многих классификациях признаки не взаимоисключающие, а ортогональные. V>Показать не можешь? Значит сидишь и думаешь. :xz: S>>PP исключает специальные знания о типе. V>Садись, два. :facepalm: V>"Истинный PP" по Карделли ТРЕБУЕТ специальных знаний о типе. V>Потому что без хотя бы частичного определения типа тебе недоступны операции над ним. V>>>Это же не принципиально - я просто показал, что разные ограничения не означают разные типы аргументов. S>>Пусть ограничения разные. Так что доказывает твой пример в отношении PP/AH? V>Что в дотнете происходит стирание типов, поэтому невозможен AH над частично определёнными типами. V>>>Стирание информации о типе - это не естественно. И это МЕШАЕТ нормальному статически-компилируемому ad hoc. S>>Стирание - это безобразно, конечно. V>За это в 2017-м пора уже расстреливать! )) V>>>Ну так, лишний код, всё равно. Чаще всего из контекста виден точный тип (или видно больше деталей-ограничений). Если бы стирания не происходило, то все разруливалось бы статически. S>>Ну так лишний код - это не принципиальная невозможность. V>Рассуждая в этом направлении можно было ограничиться скриптовыми языками с динамической типизацией. V>Нафига какой-то там статический вывод типов нужен? Что за блажь? )) S>>Я тебе приводил точные цитаты хаскельвики, и ты продолжаешь упрямиться. V>Приведи еще раз на русском. V>Потому что насчёт английского ты стал спекулировать насчёт "you can". V>Действительно, в английском эта фраза двусмыслена. В первом смысле она полностью подтверждает мой поинт, где я говорю о совместной работе разных видов полиморфизма. А во втором даёт тебе простор для спекуляций. :xz: V>ОК. Давай недвусмысленную цитату. V>>>Потому что продвижения нет. :xz: V>>>Ты игноришь аргументы, игноришь цитаты, игноришь ссылки, игноришь всё. S>>Твои аргументы опираются на определения, который ты не нашел в одной книге и потому сам выдумал. Игнорить их - самое благоразумное. V>Я приводил тебе цитаты из твоего Карделли и даже из твоих ссылок на Вики. V>Ты проигнорил ИХ ВСЕ. :facepalm: V>Саботаж, троллинг. V>>>Ты даже игноришь цитаты из своих собственных ссылок. )) S>>Разве? Я ими руководствуюсь в определении PP/AH. V>Ты руководствуешься только своей безграмотностью и неумением понимать прочитанное. V>Но этого мало - ты откровенно некрасиво поступаешь в процессе обсуждения. V>Это было нагло - аккуратно стереть цитаты из собственных ссылок как неудобные, и продолжил гнуть своё. :facepalm: V>Причем, ты продолжаешь шнуть противоречащее приведенным ТОБОЙ же ссылкам. V>Кароч, сел в лужу, имей смелость это признать. :xz: S>>Генерики дотнета действительно считаются параметрическим полиморфизмом. С поправкой - там где нет ограничений. С ограничениями это bounded PP, см вики, нуба Карделли. V>Мощно задвинул. V>"[b]Параметрический полиморзм[/b] с ограничениями" - это не "[b]параметрический полиморизм[/b]". V>Коля Иванов, какая у тебя фамилия? V>>>Я давал краткое определение параметрического полиморфизма: V>>>если тело ф-ии явно или неявно параметризуется аргументом-типом - это параметрический полиморфизм. S>>Ну я же говорю, что ты их выдумываешь. V>Пирс и Чёрч их тоже выдумали? V>Это терминология. V>>>Твой Карделли называл такие функции "шаблоном". Наверно поэтому появившиеся "шаблоны" в С++ приняли одноимённое название. V>>>Всё вместе "оно" называется обобщённым программированием, наверно отсюда растут ноги у термина "генерик" у C# и Джавы. S>>Вот сам Карделли S>>[q] S>>The functions that exhibit parametric polymorphism are also called generic functions. For example, S>>the length function from lists of arbitrary type to integers is called a generic length function. A generic S>>function is one which can work for arguments of many types, generally doing the same kind of work S>>independently of the argument type. If we consider a generic function as a single value, it has many S>>functional types and is therefore polymorphic. Ada generic functions are a special case of this concept of S>>generic S>>[/q] V>Длиннющая цитата о том, чтобы показать, что параметрически-полимофные ф-ии называются так же генериками? V>И что такой [b]функциональный[/b] (опять и снова!!!) тип считается полиморфным? V>Так это было возражение или согласие? S>>Только вот Карделли называет параметрическим полиморфизмом не те функции, которые параметризуются явно или неявно аргументом-типом. А S>>[q] S>>Strachey [Strachey 67] distinguished, informally, between two major kinds of polymorphism. S>>Parametric polymorphism is obtained when a function works uniformly on a range of types: these types S>>normally exhibit some common structure. Ad-hoc polymorphism is obtained when a function works, or S>>appears to work, on several different types (which may not exhibit a common structure) and may behave in S>>unrelated ways for each type. S>>[/q] S>>Заметь, здесь AH противопоставляется PP. V>Замечу, что ты уже второй раз попалился незнанием английского. V>Есть переведённая эта же работа в Сети в сводобном доступе, читай ей. V>Ты не понял прочитанного: V>[q] V>Parametric polymorphism is obtained when a function works uniformly on a [b]range[/b] of types V>[/q] V>Ключевое выделил. Чтобы получить range, его надо как-то задать в конкретном ЯП. V>Например, в Хаскеле "range of types" задаётся [b]классом типов[/b]. V>>>Сказано верно, но само определения явно предназначено для людей, далеких от IT, или для новичков в IT. S>>Удивляет, что тебе непонятно в этом определении? V>Меня удивляет, что тебе непонятно вот это: V>[q] V>Параметрически полиморфная функция использует аргументы на основе поведения, а не значения. V>[/q] V>[b]Поведение[/b] для абстрактных типов в языке Хаскель можно задать только через [b]классы типов[/b]. S>>Если это сказано верно V>Сказано верно. S>>то какое отношение к PP имеет твое собственное определение, не подразумевающее "вне зависимости от их типа"? V>Вот моё определение: V>[q] V>если тело ф-ии явно или неявно параметризуется аргументом-типом — это параметрический полиморфизм V>[/q] V>В отличие от Вики, оно дано для программистов, поэтому выглядит кратко. V>Более того, в Вики дан вариант "типизированного параметрического полиморфизма", а это лишь разновидность "параметрического полиморфизма". V>Или какое из слов/фраз тебе не понятно? V>Слово "параметризуется" понятно? V>Выражение "явно или неявно" - понятно? Или нужны примеры? V>"Аргумент-тип" понятно или вызывает трудности? V>Потому что ты уже бредишь, если утверждаешь, что моё определение не подразумевает "вне зависимости от их типа". V>Наоборот, моё определение как раз предполагает одно и то же тело функции для МНОГИХ (более одного) типов аргумента. V>>>Давай переведём в наши координаты: V>>>* "использует аргументы на основе поведения" - тут речь о "типизированном черном ящике", т.е. о "концепте", т.е. о паре { "черный ящик", "набор операций" }; S>>Чушь. V>В дестад, ясельную группу. V>Ты уже по-русски технические тексты не понимаешь. )) S>>набор операций над типом зависим от типа. V>Для частично определённых типов набор операций независим от конкретного типа. Через такой набор операций задаётся сразу группа типов, имеющих эти же операции. S>>Все, что использует набор операций (хотья прямо, хоть косвенно через ящик), имеет зависимость от типа. V>Или от группы типов, Ы-Ы-Ы. :facepalm: V>Видишь, как ты плаваешь в самих основах? )) V>Ты не понимаешь самих основ даже банального ООП (не то, что ФП). V>ты не понимаешь сути интерфейсов-конйептов, не понимаешь роли абстрактных классов. V>Ты не понимаешь принцип подстановки Лисков. V>Всё потому, что ты не понимаешь отличия абстрактного типа от монотипа. V>[q] V>Абстра́ктный тип да́нных (АТД) — это множество объектов, определяемое списком компонентов (операций , применимых к этим объектам, и их свойств). Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. V>[b]Абстрактный тип данных определяет набор функций, независимых от конкретной реализации типа, для оперирования его значениями.[/b] V>[/q] V>Вот. Теперь ты показал, что загвоздка у тебя была вовсе не в ad hoc и не в параметрическом полиморфизме. V>У тебя сложности с самыми базовыми вещами - абстрагированием, как идиомы разработки ПО. )) V>Получается, что ты не понимаешь того трюка, что в конкретном месте прикладного алгоритма нам зачастую нужен не весь набор операций "конкретных типов", но достаточен лишь некий "концепт", т.е. ограниченный лишь нуждами конкретного прикладного алгоритма набор этих операций. V>(Паттерн "Шаблонный метод" - основа ВСЕХ поведенческих паттернов из GoF) V>>>* "делает её применимой в любом контексте, где тип объекта удовлетворяет заданным требованиям поведения" - тут речь о наличии "ограничений" полиморфного аргумента или просто его "типизации" (да, именно так и говорится, и это вполне грамотно); Это одно и то же, что первое, т.е. определение могло быть вдвое короче. S>>Не находишь странным, что пример к этому определению не содержат ограничений, черных ящиков и вообще любых типоспецифичных операций? V>Я нахожу странным, что ты споришь не с моими утверждениями, а непонятно с чем. V>"тип объекта удовлетворяет заданным требованиям поведения" означает ограничение/типизацию аргумента полиморфной ф-ии или нет? V>А приведенный там примеры - это высер [url=https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)]вот этого человека[/url]. Укушенный узколобый НЕ программист во всей красе. Полутеоретик-полуисследователь. V>Приведенные им в кач-ве примеров параметрического полиморфизма относятся к [url=https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjKm8iW_qDSAhVGBiwKHVlDD-IQygQIITAA&url=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%259F%25D0%25B0%25D1%2580%25D0%25B0%25D0%25BC%25D0%25B5%25D1%2582%25D1%2580%25D0%25B8%25D1%2587%25D0%25B5%25D1%2581%25D0%25BA%25D0%25B8%25D0%25B9_%25D0%25BF%25D0%25BE%25D0%25BB%25D0%25B8%25D0%25BC%25D0%25BE%25D1%2580%25D1%2584%25D0%25B8%25D0%25B7%25D0%25BC%23.D0.9F.D0.BE.D0.BB.D0.B8.D0.BC.D0.BE.D1.80.D1.84.D0.B8.D0.B7.D0.BC_.D1.81.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.BD.D1.8B.D1.85_.D1.82.D0.B8.D0.BF.D0.BE.D0.B2&usg=AFQjCNGggCNKclyizzyegt3pwBYW-xKYLQ&sig2=x3O63PEKmkj1Pz4gSZokpg]структурному полиморфизму[/url], вот его примеры: V>[q] V>[haskell] V>datatype 'a foo = A of 'a V> | B of ('a * 'a) V> | C V>[/haskell] V>всякая функция над ним будет иметь вид V>[haskell] V>fun bar (p:'a foo) = V> case p of V> A x => ... V> | B (x,y) => ... V> | C => ... V>[/haskell] V>[/q] V>Вопрос. По твоей "собственной" классификации, вот по твоему чутью, выражение вида: V>[haskell] V> case p of V> A x => ... V> | B (x,y) => ... V> | C => ... V>[/haskell] V>это уже ad hoc или еще нет? ;) S>>Ты утверждаешь что определение указывает на наличие ограничений V>Само определение? - несомненно: V>[q] V>где тип объекта удовлетворяет заданным требованиям [b]поведения[/b]. V>[/q] S>>так где же ограничения в нижеследующих примерах List a, length и map? V>Помнится, тебя в Хаскель-Вики тоже смутил именно пример! )) V>Смотрим пример по ссылке: V>[haskell] V>data List a = Nil | Cons a (List a) V>[/haskell] V>List - идентфикатор типа, V>Nil, Cons - идентификаторы специальный функий-"конструкторов" в терминах ML. V>[haskell] V>length :: List a -> Integer V>[/haskell] V>Объявление читается так: есть черный ящик, производный от a, для которого определены функции-конструкторы Nil и Cons. V>А так же доступна функциональность паттерн-матчинга в зависимости от конструктора. V>Для пущего понимания дополню, что типы-суммы в Хаскеле - это всегда ссылочный тип! V>Так же как абстрактный тип в С++ - это только ссылочный тип. V>Помнишь я указывал, почему так? Потому что физический размер ссылки одинаков для разных типов. V>Итого, результат конструктора Nil и результат конструктора Cons a можно хранить в одной ссылочной переменной. V>Еще рядом из вики: V>[q] V>Просвечивающие суммы Харпера — Лилибриджа V>Наиболее сложной разновидностью записей [b]являются зависимые записи[/b]. Такие записи могут включать в себя типы наравне с «обычными» значениями (материализованные типы, reified (англ.) types[9]), причём термы и типы, следующие далее по порядку в теле записи, могут быть определены на основе предшествующих им. Такие записи соответствуют «слабым суммам» из теории зависимых типов, также известным как «экзистенциалы», и служат наиболее общим обоснованием систем модулей языков программирования. V>[/q] V>К чему я это? V>Что "типы без ограничений" в хаскеле тоже есть - те самые «экзистенциалы». V>Вот материал "для чайников" в попытыке отделить мух от котлет: V>https://habrahabr.ru/post/207126/ V>Вот оттуда про пример с List a: V>[q] V>Обобщённые АТД отличаются от обычных тем, что урезают и специализируют итоговый тип. V>В Хаскеле используется «функциональная» запись этих данных. V>Давайте перепишем простой тип данных в новом синтаксисе: V>[haskell] V>data List a = Nil | Cons a (List a) V>data List a where V> Nil :: List a V> Cons :: a -> List a -> List a V>[/haskell] V>[/q] V>Итого, Nil и Cons - это [b]функции[/b]. V>Еще из вики, "Полиморфное исчисление записей Охори": V>[q] V>Единственная полиморфная операция, предусмотренная этим исчислением — операция извлечения поля. V>[/q] V>Помнишь я выше предлагал перевод "структурного полиморфизма" в обычный через введение т.н. "селекторов"? V>Например, в C# такой элемент языка как [b]Property[/b] может быть абстрактными, виртуальными, быть членом интерфейса - это оно и есть. V>Так вот, весь этот полиморфизм записей в случае размещения в модулях (абстракциях) в том же Хаскеле именно через селекторы и работает, т.е. через обычный полиморфизм. Чудес не бывает. :xz: V>Просто ты хорошо понимаешь дотнет, где за объявлением автосвойства (выглядят как поле данных) всё-равно стоят две функции - сеттер и геттер (ан нет, это селекторы данных, а не сами данные). Но аналогичную ситуацию в Хаскеле не понимаешь и считаешь, что оно работает как-то там "само", угу. Да точно так же и работает. )) V>>>Вот тебе очередное определение параметрического полиморфизма. S>>И там явно упомянута независимость от типа. V>Там упомянуто "удовлетворение ограничениям". ЧТД. V>>>Ты же упорно и 1-е и 2-е называешь ad hoc. ))) S>>То, что требуует ограничений, я упорно называю AH. V>Но я тебе процитировал определения ПП, и там сказано об ограничениях. V>Как же так, а? :))) V>>>Или можно взять начало начал: V>>>[q] V>>>[b]ML ввел понятие параметризированного полиморфизма в языки.[/b] V>>>Типы ML могут содержать [i]переменные типов[/i], которые могут быть означены [i]разными типами в разных контекстах[/i]. Следовательно [b]возможно частично определять информацию о типах и писать программы основанные на частично определенных типах[/b], которые могут быть использованы на всем диапазоне этих типов. V>>>[/q] S>>Это историческая справка. V>Верно. Это работа Карделли на русском. V>Это была историческая справка появления термина "параметрический полиморфизм". Зачем? Потому что в следующей главе затем он вводит понятие "нетипизированного лямбда исчисления" и доопределяет параметрический полиморфизм до типизированного варианта и нетипизированного. V>Типизированный вариант - это типа генериков дотнета или класса типов в Хаскель, т.е. ПП в ограничениях. V>Нетипизированный - это "шаблонные ф-ии", т.е. генераторы кода. V>На русском - ну чтобы сложностей не возникало. V>Карделли не ставил себе задачу переопределить/оспорить формулировку ПП, он исследовал полиморфизм в различных языках. V>За ПП он оставил исходное понятие из ML. S>>Я не вижу здесь формальной связи между введением понятия ПП и возможностю частично определять информацию. V>О! Уже и на русском сложности. )) V>А я даже жирным выделил, чтобы лучше видно было. V>Карделли описал этот ПП в ML. V>Описал вполне однозначно - через [b]частичное определение типов[/b]. V>В Хаскеле, наследнике ML, их называют классами типов или обобщенными типами данных. V>Квантора всеобщности, на котором ты настаиваешь, разумеется нет. V>Есть квантор принадлежности. Оттуда же: V>[q] V>Фраза [b]имеет тип[/b] может интерпретироваться как членство в подходящем множестве. Так как идеалы в V могут перекрываться, то значения могут иметь много типов. V>[/q] V>Угу. В дотнете - несколько ограничений, в Хаскеле - несколько базовых классов для определяемых данных. V>Кстате, смотрю, Карделли рассуждает так же как я относительно идентичности механизмов ПП и ООП-полиморфизма: V>[q] V>Супертипы в объектно-ориентированных языках, могут быть представлены как параметрические типы, чьи параметры опущены пользователем. V>[/q] V>>>Итого, когда ты пишешь в дотнете where T : IEquatable<T> - ты [b]частично[/b] определяешь тип T. S>>Верно. V>>>Или когда в Хаскеле пишешь equal_to :: (Eq a) => ... - ты частично определяешь тип a. S>>Тоже. Но чистый PP не допускает специальных операций над экземпляром типа. V>Я не знаю, что такое "чистый ПП". )) V>Я знаю, что Карделли называл "истинным полиморфизмом" конкретно "типизированный ПП". Т.е. ПП в ограничениях. V>Т.е., именно [i]параметрический полиморфизм в ограничениях называется "истинным полиморфизмом"[/i]. V>С другой стороны, "истинный полиморфизм" не является термином, это просто эдакая эмоционально-окрашенная формулировка в главе с рассуждениями о типизированном лямбда-исчислении. Потому что в случае "истинного полиморфизма" тип результата ф-ии выводим, а в случае ad hoc - дудки. V>>>Вот это неполное определение типа - это и есть основной/единственный признак именно параметрического полиморфизма, а вовсе не ad hoc. S>>Ошибаешься. Признак параметрического - отсутствие ограничений. V>Но ты за несколько десятков постов не смог подтвердить ни одной цитатой, что признак параметрического - это отсутствие ограничений. V>А я тебе привел просто море цитат, что сам ПП изначально появился лишь в варианте с ограничениями, а уже потом пошли варианты без ограничений (изначально только в С++, ы-ы-ы... вот буквально несколько лет назад появились шаблонные типы и в одном диалектов Хаскеля - HGC). V>>>А где появляется ad hoc - я уже много раз тебе писал. Медитировать до просветления, как грится. S>>После тебя V>Ну я-то по профильной специальности в ВУЗ-е учился и даже был круглым отличником с повышенной стипендией. )) V>Хотя, косил безбожно все лекции и практики, появляясь на занятиях пару раз в неделю (некогда было - спортом занимался). V>Мне быстрее прочитать и разобраться самому. V>Ты так не можешь, как я погляжу. :xz:
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …