LINUX.ORG.RU

Разработчики JRuby переходят на работу в Sun


0

0

Charles Nutter и Thomas Enebo - разработчики JRuby с этого месяца работают на Sun Microsystems.

Подразумевается, что они продолжат работу над своим проектом и с помощью специалистов по JVM смогут существенно повысить скорость и стабильность JRuby,которые , как известно, сейчас ниже чем у оригинального интепретатора.Заявляется что не будет вноситься никаких изменений в лицензию данного проекта(CPL/GPL/LGPL).

JRuby - интерпретатор языка Ruby написанный на java. Сайт проекта http://jruby.codehaus.org/Home

Комментарий с другой стороны http://www.tbray.org/ongoing/When/200...

>>> Блог разработчика



Проверено: Shaman007 ()

Ответ на: комментарий от ero-sennin

> Всё-то вы любите ставить с ног на голову, фонатеги.

Ладно. Дальше можно не продолжать. Насчет пабликов я согласен. Мне лично пофигу, если это потом можно поправить. Насчет остальных пунктов комментариев не было дано.

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

Каждый выбирает язык по душе. Сейчас мне нравится Руби, потому что для меня он _интереснее_. Питон для меня слишком рафинированный и скучный. Мало новизны. Из интересных фичей только list comprehension и генераторы (ну и примочка в виде отступов :) )...

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

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

Я не знаю ни Питона, ни Руби, но возник вопрос.

> Приватные образуются путем подчеркивания переменной

Что в этом плохого?

> Раньше (не знаю, может сейчас пофиксили) при объявлении метода первым атрибутов должне идти self

Что в этом плохого?

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

>> Раньше (не знаю, может сейчас пофиксили) при объявлении метода первым атрибутов должне идти self

>Что в этом плохого?

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

Скажем так. Если бы в Питоне не было обычных функций(где этот self писать не нужно), можно было бы привыкнуть. А так, всегда нужно бдить :)

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

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

Что насчёт второго вопроса? Чем подчёркивания не угодили? Тем, что не так, как в Руби?

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

Или я чего-то не знаю о питоновых методах и self им на самом деле не нужен?

ЗЫ я собственно, ещё раз говорю, вообще питона не знаю. Интересуюсь вот.

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

>Если я ошибаюсь и мудрый Гвидо уже придумал способ, как действовать в таких ситуациях, напишите.

+1

На бытовом уровне яркой иллюстрацией "зачем это нужно" так же будут select/collect/reject в смолтолке.

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

>А ты серьезно думаешь, что Жопитоном в работе кто-то пользуется?

Пользуется. И JavaScript пользуется. Для скриптинга больших джавовских аппликух.

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

>В принципе, анонимные классы это почти аналог lisp'овского lambda (и, соответсвенно, Ruby'евских блоков) для многих случаев вполне достаточный.

Только синтаксически очень мрачный.

К стати почитайте спеку на последний (будущий) C# - там уже сделали нормальную лямбду и появился частичный type inference, анонимные структуры....

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

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

А чувства шизанутости происходящего не возникает? Назвается ООП на чистом C.

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

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

К тому же нормальная лямбда и т.п. уже есть в Scala, и чё?

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

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

Ты видел где-нибудь в ООПешном языке, чтобы в объявлении метода нужно было указывать первым аргументов this(обычный аналог self в C++/Java/PHP)? Я тоже не видел. Потому что и не должно его быть. Насколько я помню, это был костыль в ранних реализациях ООП в Питоне. Остался он потому что кода с ним написано очень много и поменять уже тяжело.

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

> Что насчёт второго вопроса? Чем подчёркивания не угодили? Тем, что не так, как в Руби?

Подчеркивания тоже по-сути костыль в реализации ООП. Хотя, согласен, с этим можно жить :).

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

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

Концепция лямбды (в Руби блоки) давно и успешно используется в SmallTalk'е и Руби. Тут нет никаких академических построений, чистая практика.

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

http://www.ruby-doc.org/core/classes/Enumerable.html http://www.ruby-doc.org/core/classes/Array.html

Например:

arr = [1, 3, 5, 9] # Создаем объект класса Array

arr.each {|v| puts v} # Выводим все элементы массива

Где {|v| puts v} - и есть анонимная ф-ция. Аналогично можно применять методы map, select и т.п.:

arr2 = arr.map {|v| v*v} # Новый массив, который содержит квадрат чисел массива arr

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

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

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

Похоже что, что моск руббиста плотно зажат между открывающим и закрывающим тэгом :))

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

> Похоже что, что моск руббиста плотно зажат между открывающим и закрывающим тэгом :))

Похоже, что моск тебя, кроме питона вообще больше ничего не видел. Потому что в C++/Java/C#/PHP/Ruby не нужно явно передавать ссылку на себя в определении метода, чтобы потом получить доступ к атрибутам класса. Она доступна всегда во всех не статических методах.

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

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

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

:)) Распарсь исходники на sk1.sf.net. Доростешь до зрелого возраста, напишешь шо нить похожее на Руби (в свободное от работы время, а не за деньги кастомера), вот тогда и поймешь несостоятельность своего нынешнего мЫшленья.

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

>Когда ждать реальной неглючной реализации?

В следующей версии?:)

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

Другой вопрос:) Но сам факт, что сначала Микрософтеров перевели с MSVS на C#, а теперь этот мейнстрим претерпевает трансформацию в какой-то "типа ocaml"....

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

>Насколько я помню, это был костыль в ранних реализациях ООП в Питоне

Есть у меня смутные подозрения (особенно учитывая __init__(self)), что где-то в компиляторе есть абсолютно прямая трансляция куда-то. Именно потому такие спецеффекты вроде self в качестве первого аргумента, и словечка типа __init__.

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

>Похоже, что моск тебя, кроме питона вообще больше ничего не видел. Потому что в C++/Java/C#/PHP/Ruby не нужно явно передавать ссылку на себя в определении метода, чтобы потом получить доступ к атрибутам класса. Она доступна всегда во всех не статических методах.

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

e-max
() автор топика
Ответ на: комментарий от Linfan

>Иначе бы у тебя такие вопросы не возникали.

В C++/Pascal/Java/C#/SmallTalk... они тоже не возникают. И только питонщики пытаются доказать что вызов self (который вероятнее всего используятся чисто для технической реализаиции в плане положения первым аргументом в стек для вызова функции this объекта, что остальные делают на уровне компилятора) является какой-то магазадумкой, а не костылем.

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

никто доказывать не пытается - просто пользуемся и фсе. Но вот упрекать Питон в необъектонсти - ну както по-пионэрски.

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

> Распарсь исходники на sk1.sf.net.

Проект вроде неплохой, правда интересно будет как оно по производительности. Насколько я понял, это связка Tcl + Python? А зачем такое странное сочетание?

За Tcl респект.

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

За несостоятельное высказывание ...

Теперь расставим все точки над self-ом. Итак, ты сказал, что:

> self - это хендл объекта? Или ты предлагаешь усе что есть снабжать хенделом автоматом?

Так вот. Из твоего суждения следует, что в Питоне бывают случаи, когда метод не снабжается хендлером? Так ведь?

А нифига не так! Приведу пример. Есть метод:

class Test:

__def echo_some(text):

____puts text

Так вот, в манах по Питону написано, что первый аргумент должен быть по-любому self. И в выше приведенном коде в text запихнется хендлер на объкт.

Таким образом, Питон всегда хочет, чтобы ты ему указал этот self, не зависимо, от того, будешь ты его использовать или нет. Он всегда ожидает первым аргументом self. Так _нафига_такая_хрень? Ведь все равно передается всегда (ну разве, кроме случаев, когда аргументов других вообще не будет).

Или может это чтобы питоновцы не забыли, что ссылка на себя называется self?

Повторюсь, это явный BAD. И если вы можете сказать что-то конструктивное, отвечайте на пост, а не апелируйте к своим достижениям.

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

> Но вот упрекать Питон в необъектонсти - ну както по-пионэрски.

Не перекручивай. Почитай первый коммент.

> Мда. Ruby будет поглощен джавой и умрет. Впрочем, туда ему и дорога; больше нормальным языкам вроде питона достанется. А джава со своими придатками пусть идет в биореактор.

И где ты видел, чтобы я говорил, что питон не оопешный?

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

> >Ruby будет поглощен джавой и умрет. Впрочем, туда ему и дорога; больше нормальным языкам вроде питона достанется.

> Питон, говоришь? А ты про Jython слышал когда-нибудь? Про то, где и как он используется? Когда ожидать "поглощения"?

Я (автор этого первого комментария) программировал на jython'е ~ пять лет назад. Он тогда совсем загибался. Ну что поделаешь, нужно было заказчику код в имеющуюся java-инфраструктуру. Года через два он загнулся окончательно на версии 2.2alpha3, кажется ;) В общем, сдох, будучи включенным в джаву.

А jruby пусть дохнет, прихватив с собой и джаву, и раби ;)

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

Значить, так. Не нравитцоо self - не юзай Питон. :) Мне так пофиг. Более того - self позволяет явно видеть филды объекта, когда педалишь. Снижает процент ошибок и делает код более читабельным. К сожалению, для Питона нет редакторов а-ля IDEA, которые бы "держали" структуру проекта. WingIDE вроде бы приближается, но еще пока не то. Поэтому, лично для меня self - весчь пользительная. Может в следующих версиях он и станет опциональным как в джаве this - посмотрим.

>Проект вроде неплохой, правда интересно будет как оно по производительности. Насколько я понял, это связка Tcl + Python? А зачем такое странное сочетание?

Проект не привязан к мегатулкитам Gtk/Gnome Qt/KDE. В результате - прога жрет только 20М памяти и достаточно шустрая (портабельность само собой). Можно было бы и напрямую через Xt - но это уж совсем нипадеццки :) Тем паче, что многие вещи пришлось бы самому выпиливать. Поэтому весь интерфейс - 100% тикль. Ну а изюминку, которую наш тим привнес - темезация тиклевого интерфейса на png-шных битмапах (поэтому очень похоже на кеды).

Но основное - канва, на которой идет работа - это не TkCanvas. Это чистейшей воды иксовый GC (ниже уже некуда). Поэтому Питон на ней и отжигает быстрее, чем Inkscape или XaraLX через кучу промежуточных layer'ов. На данный момент (то, что на SF в сорцах) графика отрисовывается только через Xlib функции, но сейчас работаю над дополнительной отрисовкой через XRender и glitz - это позволит заюзать альфаканал и антиалиасинг через аппаратное ускорение (такого в векторных редакторах еще не встречал). Если интересно - заходь сюда http://www.linuxgraphics.ru/

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

>Может в следующих версиях он и станет опциональным как в джаве this - посмотрим.

Дык никто не против неопциональности. Ну строго и хрен с ним. Но в списке аргументов - это ж маразм.

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

> Поэтому весь интерфейс - 100% тикль. Ну а изюминку, которую наш тим привнес - темезация тиклевого интерфейса на png-шных битмапах (поэтому очень похоже на кеды).

Да, вот это реально интересно. Я сейчас как раз начал учить Tcl/Tk и единственное, что отпугивало, так как раз не очень красивый вид Tk.

За сцылку и полезную инфу, сенкс :). Я раньше больше под Веб писал. Сейчас хочу пощупать десктопные апликухи, буду ковырять и смотреть как оно в деле.

Удачи вам в начинаниях :). Надеюсь, что на Линуксе появится хороший векторный редактор, лучше Inkscape'а :).

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

>jython загнулся окончательно на версии 2.2alpha3, кажется ;) В общем, сдох, будучи включенным в джаву.

WLST и wasdmin ничего не говорят? так сдох или нет?

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

Дорогуша, вы действительно джавист, или так, просто погуглить решили? ;) Не позорьтесь. Назовите реальные коммерческие проекты, вот тогда и поговорим. Под Эклипс много чего фонатеги пихают - это совсем не показатель. Как напр. плагин для работы с Питоном в Эклипсе. Муть редкостная, а аффтар уже денег хочет :)) Уж лучше получить халявную лицензию на Wing для OSS.

Resume: бабруйских земляков ищите в другом месте ;)

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

> Так вот, в манах по Питону написано, что первый аргумент должен быть по-любому self.

Вызывающе неверная информация. Ты можешь назвать его хоть pipiska666.

А если ты не понял, зачем это, то уткнись и внемли:

1. Чтобы использовать методы отдельно от объекта.

2. Чтобы функцию можно было прикрепить к классу и сделать методом.

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

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

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

На самом деле вы не совсем правы. Метод можно сохранить как экземпляр класса Method и пользовать отдельно. Вы это имели в виду ?

На вторую задачу тоже можно что-то придумать, сохранять например, метод в поле класса в виде экземпляра Proc, передавать ему при сохранении ссылку на экземпляр этого же класса, а потом вызывать .call(). это, конечно, будет выглядеть не так изящно как вызов простого метода. Но! Но... Как часто вам нужны бывают трюки типа присоединить-отсоединить метод? Это не такая уж общая практика. Так стоило было корежить создание обычного метода, ради этих двух фич пользуемых раз в сто лет? Неужели нельзя было бы скрывать передачу ссылки на self при обычной работе, но дать возможность изменить это поведение если понадобится ?

e-max
() автор топика
Ответ на: комментарий от Cris

> Второе, на вопрос о парных операциях открытия/закрытия файла, базы данных и т.п. я ответа не получил. Эта часть просто игнорируется.

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

http://www.python.org/dev/peps/pep-0343/

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

> Как часто вам нужны бывают трюки типа присоединить-отсоединить метод? Это не такая уж общая практика.

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

ero-sennin ★★
()
Ответ на: комментарий от e-max

> Неужели нельзя было бы скрывать передачу ссылки на self при обычной работе, но дать возможность изменить это поведение если понадобится ?

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

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

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

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

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

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

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

Ну примерно об этом я и написал парой постов выше Ж)

Разница во вкусах. Рубиисты любят комфорт. А он отпугивает всяких хм... мазохистов ;), которые за всеми поцелуйчиками/KISS'ами, не могут разглядеть хакерский дух :)

e-max
() автор топика
Ответ на: комментарий от e-max

> Метод можно сохранить как экземпляр класса Method и пользовать отдельно. Вы это имели в виду ?

Бугога. Ты не знал, что в питоне любой метод - сам по себе объект, и не надо никакого фарса с завертыванием его в объект класса Method, как в твоем Самом Обектно Ориентированном Языке В Мире По Имени раби?

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

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

>> Так вот, в манах по Питону написано, что первый аргумент должен быть по-любому self.

> Вызывающе неверная информация. Ты можешь назвать его хоть pipiska666.

Слушай, придурок. Если ты не можешь внимательно прочитать, то не пиши на форумах. Я имел ввиду не название, а именно смысл. Тоесть первым объектом должен идти self, а как он будет называться, глубоко насрать.

Вот кусок кода из моего поста выше.

class Test:

__def echo_some(text):

____puts text

Там же я внятным языком написал, почему self не нужен в _ОБЪЯВЛЕНИИ_ метода. Любому человеку понятно, что внутри метода self нужен. Если твой мозк не можешь понять, что в ____объявлении____ self лишний(потому что объявлять его нужно в принудительном порядке иначе будет перекос), то выводы сделай сам.

> 2. Чтобы функцию можно было прикрепить к классу и сделать методом.

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

а) Простой include ModuleName - подключает все методы из нужного тебе модуля. Это стандартный способ. Но подключает все. Остановись, не строчи свой ответ, дочитай пост до конца.

б) а вот, то что хочет твой плавящийся от возбуждения мозк:

def method

__self.outer_method = Class.need_method

end

Так что Мацумото знает, а ты тупая скотино, точно не знаешь.

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

> Если бы ты не подскакивал, как экзальтированная барынька, а вежливо спросил, тебе бы давно ответили. А теперь иди и не возвращайся, пока на асилишь PEP-343, жертва мусорного раби.

Послушай, ты, любитель резиновых женщин. Сначала прочитай первые 10 постов в этом топике. Потом почитай название. Ты там видишь слово Питон? Я его тоже не вижу.

Насчет твоего ПЕПППаа... Это, что, блин. На каждый чих - новый Пеп строчить? Типа кошерное решение?.. А если еще какоя-то хрень понадобится? Тоже ПеП делать? И это блин решение?

> Нельзя, ибо KISS инивалнует.

Какой же, бля нахуй КИСС??? Кис май эс, что ли? ПЕпы он мне показывает. Эти вещи реализованы на уровни библиотеки, стандартно в Руби, без лишних изъебов мозга. Иди отсюда и не позорься.

А еще, если ты не засцышь как собака, напиши мне ответ на пост про селфы, потому что твоя сраная фиченка реализуется в Руби не сложнее чем в Питоне.

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

PEP-343 это забавно. Оказывается у питоновцев был PEP-340, которых как-раз предлагал добавить нормальные анонимные блоки, но питоновцы отказались это него, цитирую:

"PEP 340, Anonymous Block Statements, combined many powerful ideas: using generators as block templates, adding exception handling and finalization to generators, and more. Besides praise it received a lot of opposition from people who didn't like the fact that it was, under the covers, a (potential) looping construct. This meant that break and continue in a block-statement would break or continue the block-statement, even if it was used as a non-looping resource management tool. But the final blow came when I read Raymond Chen's rant about flow-control macros[1]. Raymond argues convincingly that hiding flow control in macros makes your code inscrutable, and I find that his argument applies to Python as well as to C. I realized that PEP 340 templates can hide all sorts of control flow; for example, its example 4 (auto_retry()) catches exceptions and repeats the block up to three times."

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

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

self нужен только методам объекта. он не нужен методам класса 
(статическим методам).

class Test
  def method(self, text): print text

  @staticmethod
  def staticMethod(text): print text


Test().method('bla')
Test.staticMethod('bla')

явное указание self в качестве аргумента метода объекта позволяет на 
этапе вызова функции обнаруживать ошибки, которые, в динамических языках
 с "неявным this", выявляются в процессе выполнения функции.

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

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

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

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

Зачет!

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