Резюмируя восемь страниц, "не бывает быдлоязыков, бывают быдлопрограммеры".
Желающим - прошу что-нибудь провякать по поводу системы на PHP, которую я написал в ноябре, и которая: а) снаружи никогда не догадаешься, что она на PHP. Люди просто уверены, что это статика, пока не откроют форум :) б) Выдержал 20000 юзеров в день на одном сервере.
К сожалению, не имею права приводить ссылки, но думаю, любой приличный программист на PHP подтвердит, что создание такой системы - не такая уж и сложная задача, надо всего лишь качественно программировать.
Далее, приведу пример полноценной CMS системы на Parser, писанной два года назад за две недели ровно. Слабо? Думаю нет. А слабо сделать это же, первый раз в жизни увидев язык? :) Это по поводу порогов вхождения.
> "не бывает быдлоязыков, бывают быдлопрограммеры".
Очень даже бывают ;( Visual Basic (да и вообще любой Basic, наверное). Ранние Фортраны (ОК, это было от недостатка опыта). И я слышал много плохого об ABAP/4 8) (ничего против PHP не имею - не пользовался).
> а) снаружи никогда не догадаешься, что она на PHP. Люди просто уверены, что это статика, пока не откроют форум
а чо скрывать? стыдно?
> Выдержал 20000 юзеров в день на одном сервере.
20к юзеров в день? та ты герой просто. посмотрим шоб твой сервер сказал если б у тебя там два ляма было.
кстате ещо один гвоздь в гроб пхп вспомнил - тредов нет и не будет. в результате для консольных приложений приходится юзать чойто другое и переписывать половину функций на нормальных языках. специально для быдлокодеров: форки и вызов 1.php & 1.php & 1.php не предлагать. надо шоб треды общались между собой красиво а не через искуственно выданную шаред мемори или мой-екслюел. кроме того иногда приходится массивы по 800 метров держать в памяти. три раза форкнул - машине кирдык
Какая-то имхо путаница с этими блоками в руби. Блок - это конструкция типа {|a| foo(a)}. Но сама по себе такая конструкция не имеет смысла! Для того, чтоб создать из неё функцию, надо к ней зачем-то присобачить ключевое слово proc или lambda (синонимы): proc {|a| foo(a)}. Но хрен с ним. Создали мы какую-то функцию: hello = proc {|name| "Hello, #{name}!"}. Теперь пытаемся вызвать её: hello('Piotr Ivanovitch'). А фигу! Не получится, ибо это ни разу не функция, а невнятный объект типа Proc. Надо, почему-то, так: hello.call('Piotr Ivanovitch'). Уссаться и сдохнуть.
Казалось бы, простая конструкция типа {|a| blabla(a)} должна возвращать объект типа "функция", и всё было бы в шоколаде. Но нет. Пдозреваю, из-за того, что фигурные скобки используются ещё и для ассоциативных массивов, типа {'a' => 'b', 'aa' => 'bb'}, и без ключевого слова proc возникла бы двусмысленность.
Резюме: Мацумото бездумно нахватал конструкций из разных языков, и получилась лажа. Те же фигурные скобки обозначают и ассоциативные массивы, и блоки кода. Писать парсер для такого чудо-языка я бы не взялся ни за какие коврижки. Ну оставили бы вместо скобок begin и end, гораздо проще было бы всё, так нет же, погнались за быдлофичами. Ну и сами ЗБ, млин. Про седовские регекспы уже сказали. К версии 3.0 это будет чучело небесное похлеще перла. Ещё попомните моё слово.
> Пдозреваю, из-за того, что фигурные скобки используются ещё и для ассоциативных массивов, типа {'a' => 'b', 'aa' => 'bb'}, и без ключевого слова proc возникла бы двусмысленность.
Вряд ли. Заглядываешь на 1 токен вперед, и если он '|', то это блок кода.
Но логичности Руби не хватает, это да. Впрочем, автор это признает.
Я пытался, друк. Но после фразы "First, some general observations. Ruby syntax is clean." меня пробило на такое дикое ха-ха, что дальше продолжать физически не мог. :)))))
Неправда. Конструкция {|a| foo(a)} вообще ничего не возвращает, кроме синтаксической ошибки.
А вот proc {|a| foo(a)}, как мы ежу заметили, действительно возвращает объект типа Proc. Внимание, вопрос. Какого хрена он не может просто вернуть объект типа "функция", как делают все нормальные языки.
На всякий случай: суперкласс имелся в виду. После откровений про необходимость работы с методами в ОО-языке как с функциями в функциональном, я уже ничему не удивлюсь.
> А ну марш основы объектно-ориентированного программирования штудировать, в целях леквидации безграмотности.
Да уж. Объяснил как по полкам разложил. Не возвращает объект типа "функция", потому что возвращает объект типа Proc. Вместо a() надо говорить a.call, потому что это круто. Жду от Вас внятных объяснений или засчитываю слив.
И да, что в питоне, что во всяком хаскеле лямбда-нотация используется для создания нормальных полноценных функций, а не всякого кала типа Proc "потамушто ОБЪЕКТ и ни$%ёт".
> Потому, что он возвращает объект типа Proc, как делают нормальные объектно-ориентированные языки. Ключевое слово - объект. Его тип - дело десятое.
Вы бы так не подставлялись, молодой человек. Во всех полноценных объектно-ориентированных языках всё - объект, и функция тоже. И ничто не мешает вызывать её как a(), разве что странная мазохистская религия.
> Во всех полноценных объектно-ориентированных языках всё - объект, и функция тоже. И ничто не мешает вызывать её как a(), разве что странная мазохистская религия.
А, вот даже так. Хехе. Ну и как вы _вызовите_ _объект_? И сообщение ему отсылать не надо? Или вы хотите, чтобы () был забинден на метод call? Круто, круто.
> Я пытался, друк. Но после фразы "First, some general observations. Ruby syntax is clean." меня пробило на такое дикое ха-ха, что дальше продолжать физически не мог.
> Сколько раз мне ещё написать, что ruby - не функциональный язык, чтобы до вас это наконец дошло?
То есть, вся эта чехарда придумана лишь для того, чтоб руби можно было называть объектно-ориентированным языком? И пофиг на удобство программирования? Так испей же яду, анонимус, ибо тот же питон - ну офигенно объектно-ориентированный язык, но никаких левых сущностей "типа Proc" там нет. Есть лишь объект типа function, и вызов функции выглядит как f(). Ибо питон писался для работы, а не для кривых форумных понтов.
А разница между функциональным и ОО-языком исключительно в названии. На практике все языки делятся на те, которые хорошо решают поставленную задачу, и те, которые идут фтопку.
> А вот proc {|a| foo(a)}, как мы ежу заметили, действительно возвращает объект типа Proc. Внимание, вопрос. Какого хрена он не может просто вернуть объект типа "функция", как делают все нормальные языки.
А написать proc перед блоком, чтобы получить объект Proc (что может быть логичнее...) - это тебя так напрягает? Кстати, если в определении метода, с которым связан блок, указать последний параметр в виде ¶m, то метод получит блок как объект Proc через этот параметр. В обычных случаях и этого не надо, потому что блок вызывается через yield.
> А, вот даже так. Хехе. Ну и как вы _вызовите_ _объект_? И сообщение ему отсылать не надо?
Ёпта, сколько говорить, руби - не смолток. И рядом даже не лежал со смолтоком. И никакой концептуальной чистотой не отличается, в отличие от смолтока. И закос под смолток ради того, чтоб было похоже на смолток - смешные понты, которые мешают людям нормально программировать.
> Или вы хотите, чтобы () был забинден на метод call? Круто, круто.
В питоне примерно так и сделано, кстати, только метод называется __call__. И что, От этого Питон перестал быть объектно-ориентированным? Или синтаксис его стал грязнее, чем у руби?
>Во всех полноценных объектно-ориентированных языках всё - объект, и функция тоже. И ничто не мешает вызывать её как a(), разве что странная мазохистская религия.
Ну да, по твоей логике () - это метод? :) Подумай, прежде чем глупости писать.
С этим я как раз не спорю. Но вот захотелось Матцу закосить под смолтолк. Взял и закосил. И требования, чтобы ruby работал как python выглядят по мешьшей мере странно.
> Боюсь, что разница только на бумаге. :D А чисто ОО-язык есть только один - Smalltalk.
Ну да. Так и есть. В ruby всякого говна навалом. Но это не значит, что нужно туда класть новое (Матц вроде и сам догнал, что херню сделал, но поздно. Рельсы уже тютю. Ему не дадуд).
> С этим я как раз не спорю. Но вот захотелось Матцу закосить под смолтолк. Взял и закосил.
Ладно бы только под смолток. Он одновременно закосил и под перл, и под руби, и под лисп, и под аду, да и без питона не обошлось. Так что требовать, чтоб это чучельце работало как смолток по меньшей мере смешно.
> В ruby всякого говна навалом. Но это не значит, что нужно туда класть новое
Так итить, надо сначала башкой думать, а потом уже ваять мегаязыки. А не как чукча: что вижу, то пою. А не можешь сам - так хоть у Гвидо совета спроси. :D
И как тут не вспомнить мудрого Страуса. Он же костьми ложится, прежде чем комитет нововведение в Си++ добавит. Есть и обратная сторона. Но главное - есть стабильность. Я Матц всё в бирюльки играется.
> Объект, объект. Просто ruby косит под смолтолк, как правильно заметили. То есть: раз это объект, ему _надо_ слать сообщения, иначе никак.
Я про те функции, которые создаются с помощью ключевого слова def. Если это не объект, то что? Методы, принадлежащие одному-единственному невидимому и неназываемому объекту? Кто этот объект? (Ктулху что ли??)